Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   socks 4 получение IP (https://forum.antichat.xyz/showthread.php?t=102694)

nc.STRIEM 23.01.2009 15:42

socks 4 получение IP
 
Возникла необходимость написать програмку которая будет работать протоколом сокс 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];


Время: 14:31