2015-01-24 2 views
0

Мое приложение требует использования Tor над прокси-сервером socks4a. В настоящее время мой ответ от тор сообщается как успешные, но не сообщается порт или Ip, который необходим для 4a варианта носков, согласно этой википедии статье SOCKS:Tor Socks4a Неполный ответ

поля 1: нулевые байты
поле 2 : состояние, 1 байт:

0x5a = запрос предоставляется
0x5b = запрос отклонен или не
0x5c = Сбой запроса
0x5d = Сбой запроса

поле 3: сетевой номер порта порядок байт, 2 байта
поле 4: сеть IP порядок байт адреса, 4 байта

Tor не заполняя поля 3 и 4, почему он делает это, и как я могу исправить Это?

Результаты носки Рукопожатие:

Request: 0x04, 0x01, 0x00, 0x50, 0x00, 0x00, 0x00, 0x08, 0x00, 0x77,  
0x77, 0x77, 0x2E, 0x67, 0x6F, 0x6F, 0x67, 0x6C, 0x65, 0x2E, 0x63, 0x6F, 0x6D, 0x00 

Response from Tor: 0x00, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 

Исходный код:

retval = connect(in_Socket, in_Socks, socksLen); //Connecting to Socks Server 

    if (retval != 0) 
     return retval;      //Error if !=0 

    if (szUserId) 
     lPacketLen += strlen(szUserId); //If there is a userid, add its length to the packet length 

    lPacketLen += strlen(szHostName); //www.google.com 
    lPacketLen += 1; 
    char *packet = new char[lPacketLen];//Allocate a packet 
    memset(packet, 0x00, lPacketLen); //Init to zero 
    packet[0] = SOCKS_VER4;    //Socks version: 0x4 
    packet[1] = 0x01;     //Connect code 

    memcpy(packet + 2,(char *)&(((sockaddr_in *)in_szName)->sin_port),2); //Copy the port, 80 in this case 

    //Send a Malformed IP, as per Socks4a states 
    packet[4] = 0x00; 
    packet[5] = 0x00; 
    packet[6] = 0x00; 
    packet[7] = 0x8; 

    int IDLen = strlen(szUserId); 
    if (szUserId)        //If there was a userid, copy it now 
     memcpy(packet + 8, szUserId, ++IDLen); //Account for null terminator /0 
    else 
     packet[8] = 0; //Send null ID if none provided 

    //Write the hostname we want Tor to resolve, i used www.google.com 
    memcpy(packet + 8 + IDLen, szHostName, strlen(szHostName) + 1); 

    if (m_Interval == 0) 
     Sleep(SOCKS_INTERVAL); 
    else 
     Sleep(m_Interval); 

    printf("\nRequest: "); 
    PrintArray(packet, lPacketLen); 


    send(in_Socket, packet, lPacketLen, 0); //Send the packet 
    delete[] packet;  //Unallocate the packet 

    char reply[8];   //Allocate memory for the reply packet 
    memset(reply, 0, 8); //Init To 0 

    long bytesRecv = 0; 
    bytesRecv = recv(in_Socket, reply, 8, 0); //Get the reply packet 

    printf("\nResponse from Tor: "); 
    PrintArray(reply, 8); 

    //Check Reply Codes later 

ответ

0

Оказывается, что Tor рассматривает это в качестве необязательного поля, это, кажется, помню адрес соединения, решить ее, а затем вперед любые данные после рукопожатия в разрешенный домен.

Смежные вопросы