when I do 100 non-block socket connection in 1 thread,it is very slow(the number of connection increased one by one),but if I do a blocking socket connection in 100 parallel threads(one connect per thread), it is very fast(get done immediately )
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fcntl(sock, F_SETFL,O_NONBLOCK)!=0)
{
perror("fcntl nonblock");
return -1;
}
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,&reuseAddr, sizeof(reuseAddr))!=0)
{
perror("reuse addr");
return -1;
}
sAddr.sin_addr.s_addr = inet_addr(SRV_ADDR);
sAddr.sin_port = htons(1972);
if ((n=connect(sock, (const struct sockaddr *) &sAddr, sizeof(sAddr))) < 0)
{
if (errno !=EINPROGRESS) {
perror("client connect error");
return -1;
}
}
else if (n>=0)
{
printf("#%d connected\n",sock);
}
return sock;
Awesome question :-). Here’s why I think this is happening. The standard says this:
The question of course is what “immediately” means. I believe that “immediately” is actually some small time that allows the
SYN,SYN-ACK,ACKto happen. If it didn’t wait at all, it would have 0-chance of actually succeeding.So basically:
SYNSYN-ACK.In doing so it returns successfully instead of
EADDRINUSE.Now, when using threads, each thread does this so nobody waits. They all just
connect(2)and context switching allows everybody to do it almost simultaneously.