Я написал запуск кода c/c++ в Ubuntu, который имитирует процесс рукопожатия.
//Create a raw socket
int s = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
//some address resolution
strcpy(source_ip , "192.168.1.9");
sin.sin_family = AF_INET;
sin.sin_port = htons(1235);
sin.sin_addr.s_addr = inet_addr ("192.168.1.6");
if (setsockopt (s, IPPROTO_IP, IP_HDRINCL, val, sizeof (one)) < 0)
{
perror("Error setting IP_HDRINCL");
exit(0);
}
{
//Send the packet
if (sendto (s, datagram, iph->tot_len , 0, (struct sockaddr *) &sin, sizeof (sin)) < 0)
{
perror("sendto failed");
}
//Data send successfully
else
{
printf ("Packet Send. Length : %d \n" , iph->tot_len);
}
}
int l;
if( recvfrom(s,buffer,4096,0, (struct sockaddr *) &sin, &l)<0)
{
perror("sendto failed");
}
//Data send successfully
else
{
printf ("Packet recv. ");
}
printf ("Enter number to end: ");
int numm=getchar();
close(s);
return 0;
Код начинается с отправки пакета SYN на адрес 192.168.1.6:1235, который работает в Windows.
Пакет SYN правильно достиг адреса 192.168.1.6:1235.
SYN-ACK правильно дошел до Ubuntu (192.168.1.9:1234).
Но в Wireshark показывается RST вместо ACK.
Я запускаю netcat –l –p 1235 на 192.168.1.6.
Я пробовал все следующее:
- используйте netcat на исходном компьютере (ubuntu), чтобы открыть тот же порт (1234), который я использовал при отправке SYN.
- брандмауэр в убунту отключен по умолчанию.
- Я написал небольшой код, позволяющий этой машине быть сервером на том же порту (1234), который я использовал в SYN.
- Я обновил код, который отправил пакет SYN, чтобы разблокировать сокет, если я не вставлю какой-либо символ.
Но проблему никто не решает.