PDA

Просмотр полной версии : socks 4 получение IP


nc.STRIEM
23.01.2009, 15:42
Возникла необходимость написать програмку которая будет работать протоколом сокс 4.
Программа работает как сокс сервер, ток проблемма в том что когда она по протаколу сокс получает IP адрес, некоторые актеты в нем оказываться отрицательными. Не могу понять в чем причина. Вот кусок программы в котором проблемма

#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/

Вроде понятно обяснил)

__mad
23.01.2009, 18:50
если всё соответствует протоколу, то проблема с типами
-44 как раз соответствует 213
char auth[8]; замени на unsigned char auth[8];