Попытка разобрать десятичное значение dstAddr.sin_addr.s_addr из массива recv () - PullRequest
1 голос
/ 26 августа 2011

Я пытаюсь написать небольшой прокси-носки в качестве упражнения.

Я пытаюсь проанализировать запрос соединения SOCKS от входящего соединения. Протокол socks указывает, что желаемым адресом назначения будет байт 4,5,6,7, а желаемым портом - байт 2,3 (байт 0 и 1 являются командами протокола). Поэтому я хочу проанализировать эту информацию, чтобы установить исходящее соединение с прокси, а затем передавать туда и обратно данные между сокетами. Я довольно новичок в C, но я решил, что начну с того, что меня интересует, так что терпите меня, если есть ужасные ошибки новичка:)

IP-адрес и порт неверно рассчитываются для значений границ, обычно это короткие 254. Это должно быть что-то довольно очевидное, что я пропускаю, но я просто еще не понимаю: -)

Это код, который у меня сейчас есть:

enter code here

void ProxyData(int rcvSocket)
{
char rcvBuffer[RCVBUFSIZE];        
int recvMsgSize;                   
char Socks4Response[] = "\x00\x5a\x00\x00\x00\x00\x00\x00";

int dstSocket;
int dstIP;
struct sockaddr_in dstAddr;
int dstPort;

if ((recvMsgSize = recv(rcvSocket, rcvBuffer, RCVBUFSIZE, 0)) < 0)
     perror("recv() failed");
dstIP = (rcvBuffer[4]*16777216)+(rcvBuffer[5]*65536)+(rcvBuffer[6]*256)+rcvBuffer[7];
dstPort = rcvBuffer[2]*256+rcvBuffer[3];
if ((rcvBuffer[0] == 0x04))
     send(rcvSocket, Socks4Response, 9, 0);
if((dstSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
     perror("socket() failed"); 

memset(&dstAddr, 0, sizeof(dstAddr));
dstAddr.sin_family           = AF_INET;
dstAddr.sin_addr.s_addr      = htonl(dstIP);
dstAddr.sin_port             = htons(dstPort);

if (connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr)) < 0 )
     perror("connect() failed");
while (recvMsgSize > 0) 
  { stuff }
close(rcvSocket);
close(dstSocket);
}

Ответы [ 2 ]

1 голос
/ 26 августа 2011

В ваших вопросах нет вопросов, но при условии, что вы хотите, чтобы мы помогли отладить код.Непосредственно возникает проблема:

char rcvBuffer[RCVBUFSIZE];
...
dstIP = (rcvBuffer[4]*16777216)+(rcvBuffer[5]*65536)+(rcvBuffer[6]*256)+rcvBuffer[7];

Большинство компиляторов обрабатывают символ как подписанный, что означает, что он может быть отрицательным.добавление выше предполагает, что оно не подписано.Вы должны изменить его таким образом.

Однако вы можете просто разыграть его.

struct in_addr *dstIP = (struct in_addr*)(rcvBuffer + 4);

Теперь dstIP будет корректным и уже в сетевом порядке байтов, поэтому нет необходимости в htonl:

dstAddr.sin_addr = *dstIP;

То же самое с портом, тип in_port_t.

0 голосов
/ 26 августа 2011

Вы можете просто использовать memcpy(), чтобы скопировать адрес и порт непосредственно в struct sockaddr_in:

dstAddr.sin_family = AF_INET;
memcpy(&dstAddr.sin_addr.s_addr, &rcvBuffer[4], 4);
memcpy(&dstAddr.sin_port, &rcvBuffer[2], 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...