Возникла необходимость написать програмку которая будет работать протоколом сокс 4. Программа работает как сокс сервер, ток проблемма в том что когда она по протаколу сокс получает IP адрес, некоторые актеты в нем оказываться отрицательными. Не могу понять в чем причина. Вот кусок программы в котором проблемма Code: #include <winsock2.h> #include <stdio.h> #include <math.h> #pragma comment(lib,"ws2_32") #define SLISTEN_PORT 8080 //порт #define LISTEN_BACKLOG 5 //////***************************************************************************************************///// DWORD WINAPI SocketListen(LPVOID AS) { SOCKET AcceptSocket = (SOCKET)AS; char auth[8]; recv(AcceptSocket, auth, 8, 0); char c; do { recv(AcceptSocket, &c, 1, 0); }while(c); if(auth[0] != 0x04 || auth[1] != 0x01) { printf("#%d Auntification error\n", AcceptSocket); send(AcceptSocket, "\x00\x05b\xd3\xd1", 4, 0); closesocket(AcceptSocket); return false; } unsigned port = (auth[2] * 256) + auth[3]; char ip[16]; sprintf(ip, "%d.%d.%d.%d", auth[4], auth[5], auth[6], auth[7]); printf("#%d Connect %s:%d \n", AcceptSocket, ip, port); return true; } int main(int argc, char *argv[]) { WSADATA wsaData; if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR) return printf("Error at WSAStartup()\n"); SOCKET ListenSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if (ListenSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); WSACleanup(); return 0; } SOCKADDR_IN sa = {0}; int len = sizeof(sa); sa.sin_family = AF_INET; sa.sin_addr.s_addr = INADDR_ANY; sa.sin_port = htons( SLISTEN_PORT ); if( bind( ListenSocket, (sockaddr*)&sa, len ) == SOCKET_ERROR ) { printf("bind() failed.\n"); closesocket(ListenSocket); return 0; } if( listen( ListenSocket, LISTEN_BACKLOG ) == SOCKET_ERROR ) { printf("Error listening on socket.\n"); closesocket(ListenSocket); return 0; } printf("Server start at port: %d \nWaiting...\n",SLISTEN_PORT ); SOCKET AcceptSocket; DWORD thID; while( (AcceptSocket = accept( ListenSocket, (sockaddr*)&sa, &len )) != -1 ) { printf("#%d Connection from %s:%d\n", AcceptSocket, inet_ntoa(sa.sin_addr), htons(sa.sin_port)); CreateThread(0, 0, SocketListen, (LPVOID)AcceptSocket, 0, &thID); } return 1; } Запускаю этот код, в браузере происую socks4 на 127.0.0.1:8080 , ввожу в браузере адрес наример ya.ru, в консоли должен высыититья IP яндекса тоесть 213.180.204.8 вместо этго выводиться -44.118.48.97 тоесть IP не верно получаться. В чем ошибка, вроде все соотвтствует протоколу socks4/ Вроде понятно обяснил)
если всё соответствует протоколу, то проблема с типами -44 как раз соответствует 213 char auth[8]; замени на unsigned char auth[8];