тут случайно увидел...
Под виндами простейшая программа пытающаяся открыть коннект (ессно используя сокеты) по порту, который ни кем не прослушивается. И что мы видим в tcpdump ? мы видим ТРИ попытки ! Причем с одним и тем же сиквенсом.
Проверил то же самое под линухом: все в порядке - попытка только одна.
И нафига спрашивается ломиться лишних два раза ? Интересно, это так и было задуманно или очередной баг у майкрософта ?
Что бы не быть голословным, привожу тестовые программки и дампы.
Это Windows программка:
#include <stdio.h>
#include <winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons( 4000 );
server.sin_addr.s_addr = inet_addr( "192.92.7.1" );
SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );
if( connect( s, (struct sockaddr*)&server, sizeof(struct sockaddr_in) ) == -1 )
{
printf( "connect faild\n" );
return;
}
return;
}
---
Вот что показывает tcpdump:
00:12:24.412629 192.92.7.2.2301 > 192.92.7.1.4000: S 2604852891:2604852891(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)
00:12:24.412629 192.92.7.1.4000 > 192.92.7.2.2301: R 0:0(0) ack 2604852892 win 0 (DF)
00:12:24.852629 192.92.7.2.2301 > 192.92.7.1.4000: S 2604852891:2604852891(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)
00:12:24.852629 192.92.7.1.4000 > 192.92.7.2.2301: R 0:0(0) ack 1 win 0 (DF)
00:12:25.352629 192.92.7.2.2301 > 192.92.7.1.4000: S 2604852891:2604852891(0) win 16384 <mss 1460,nop,nop,sackOK> (DF)
00:12:25.352629 192.92.7.1.4000 > 192.92.7.2.2301: R 0:0(0) ack 1 win 0 (DF)
---
А это та же программка запущенная из под Linux:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main()
{
int sock;
struct sockaddr_in server = {AF_INET, htons(4000)};
sock = socket( AF_INET, SOCK_STREAM, 0 );
server.sin_addr.s_addr = inet_addr( "192.92.7.1" );
if( connect( sock, (struct sockaddr*)&server, sizeof( struct sockaddr_in)) != -1 )
printf( "OK\n" );
else
printf( "FAILD\n" );
return 1;
}
---
И её tcpdump:
00:20:52.202629 192.92.7.2.32771 > 192.92.7.1.4000: S 4233571007:4233571007(0) win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 0> (DF)
00:20:52.202629 192.92.7.1.4000 > 192.92.7.2.32771: R 0:0(0) ack 4233571008 win 0 (DF)
---
|