Я пытаюсь написать небольшой прокси-носки в качестве упражнения.
Я пытаюсь проанализировать запрос соединения 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);
}