socks 4 получение IP

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by nc.STRIEM, 23 Jan 2009.

  1. nc.STRIEM

    nc.STRIEM Members of Antichat

    Joined:
    5 Apr 2006
    Messages:
    1,036
    Likes Received:
    347
    Reputations:
    292
    Возникла необходимость написать програмку которая будет работать протоколом сокс 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/

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

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    если всё соответствует протоколу, то проблема с типами
    -44 как раз соответствует 213
    char auth[8]; замени на unsigned char auth[8];
     
    1 person likes this.