На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Фильтр пакетов(помощь)
    Прошу помощи. Вопрос такой:
    Требуется создать филтр пакетов который отлавливает пакеты от какой либо проги клиента и посылает их проге серверу уже либо такими же либо отфильтрованными.

    пробывал через сокеты создать сервер отлавливал буффер пакетов который посылает клиент а потом передавать этот буфер уже как клиент серверу тоже через сокет...
    вопрос почему пакеты не воспринимаются сервером я же ничего не меняю просто передаю буфер косвенным путем?
      если быть более точным то обьясните плз по какому принципу надо создавать такую прогу:
      1)Она отлавливает все пакеты от программы клиента идущие к серверу
      2)Изменяет пакеты(это не главное) можно хотябы просто очтавлять их не меняя
      3)И потом эта прога сама отсылает серверу исправленные пакеты.

      я бонально пробывал сделать это через сокеты
      ExpandedWrap disabled
         
         
        #include "stdafx.h"
        #include<conio.h>
        #include<stdio.h>
         #include "Winsock2.h"
         
         
         
         
        #define DEFAULT_BUFFER_SIZE 40960L
         
        int main(int argc, char* argv[])
        {
            WSADATA WsaData;
            int err = WSAStartup (0x0101, &WsaData);
            if (err == SOCKET_ERROR)
            {
                    printf ("WSAStartup() failed: %ld\n", GetLastError ());
                    return 1;
            }
        SOCKET s = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP);
         
         
        SOCKADDR_IN sin;
            sin.sin_family = AF_INET;
            sin.sin_port = htons(9999);//порт на который коннектится клиент
            sin.sin_addr.s_addr = INADDR_ANY;
         
        err = bind( s, (LPSOCKADDR)&sin, sizeof(sin) );
        err = listen( s, SOMAXCONN);
        SOCKADDR_IN from;
            int fromlen=sizeof(from);
         SOCKET s1 = accept(s,(struct sockaddr*)&from, &fromlen);//принимает клиент
         
        printf("accepted connection from %s, port %d\n", inet_ntoa(from.sin_addr), htons(from.sin_port)) ;
         
        SOCKADDR_IN anAddr;
            anAddr.sin_family = AF_INET;
            anAddr.sin_port = htons(2595);//порт коннекта к серверу
            anAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//адрес сервера
        SOCKET s2 = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP);
            connect(s2, (struct sockaddr *)&anAddr, sizeof(struct sockaddr));// коннектимся к серверу
        char *RecvBuffer = (char*)malloc(DEFAULT_BUFFER_SIZE);
         
         
                DWORD size = DEFAULT_BUFFER_SIZE;
                DWORD ret;
                
         
        while(recv(s1,RecvBuffer,size,0)!=ERROR_SUCCESS)//SOCKET_ERROR)//получаем буффер от клиента
            {if(ret == ERROR_MORE_DATA)
                    {
                        // buffer size was too small, increase allocation size
                        size += DEFAULT_BUFFER_SIZE;
                        
                        
                        RecvBuffer = (char*)realloc(RecvBuffer, size);
                    }
         
         
         
            send(s2,RecvBuffer,size,0); //отсылаем буфер серверу
            free(RecvBuffer);  
            RecvBuffer = (char*)malloc(DEFAULT_BUFFER_SIZE);
         
        }          
                    
         
         
            
            getch();
         
         
         
         
         
         
         
            return 0;
        }


      объясните что не так? или может есть другие пути?
      я не очень понимаю почему сервер не воспринимает эти пакеты... ведь даже если инкрип и есть то ведь я же ловлю пакеты от самого клиента(тоесть уже криптованные) и отсылаю их серверу...
      Очень прошу помогите
        что неужели никто помочь не может :(
          неправильно используешь
          recv(s1,RecvBuffer,size,0)!=ERROR_SUCCESS

          "If no error occurs, recv returns the number of bytes received. If the connection has been gracefully closed, the return value is zero. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError."

          И вопрос немного не в этот раздел.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0234 ]   [ 16 queries used ]   [ Generated: 1.05.24, 23:28 GMT ]