Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.222.12] |
|
Сообщ.
#1
,
|
|
|
Прошу помощи. Вопрос такой:
Требуется создать филтр пакетов который отлавливает пакеты от какой либо проги клиента и посылает их проге серверу уже либо такими же либо отфильтрованными. пробывал через сокеты создать сервер отлавливал буффер пакетов который посылает клиент а потом передавать этот буфер уже как клиент серверу тоже через сокет... вопрос почему пакеты не воспринимаются сервером я же ничего не меняю просто передаю буфер косвенным путем? |
Сообщ.
#2
,
|
|
|
если быть более точным то обьясните плз по какому принципу надо создавать такую прогу:
1)Она отлавливает все пакеты от программы клиента идущие к серверу 2)Изменяет пакеты(это не главное) можно хотябы просто очтавлять их не меняя 3)И потом эта прога сама отсылает серверу исправленные пакеты. я бонально пробывал сделать это через сокеты #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; } объясните что не так? или может есть другие пути? я не очень понимаю почему сервер не воспринимает эти пакеты... ведь даже если инкрип и есть то ведь я же ловлю пакеты от самого клиента(тоесть уже криптованные) и отсылаю их серверу... Очень прошу помогите |
Сообщ.
#3
,
|
|
|
что неужели никто помочь не может
|
Сообщ.
#4
,
|
|
|
неправильно используешь
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." И вопрос немного не в этот раздел. |