c - 为什么非阻塞套接字连接这么慢?

标签 c sockets

当我在 1 个线程中进行 100 个非阻塞套接字连接时,它非常慢(连接数逐个增加),但是如果我在 100 个并行线程中进行阻塞套接字连接(每个线程一个连接),非常快(立即完成)

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;

最佳答案

很棒的问题:-)。这就是我认为这正在发生的原因。标准是这样说的:

If the connection cannot be established immediately and O_NONBLOCK is set for the file descriptor for the socket, connect() shall fail and set errno to [EINPROGRESS]

当然,问题是“立即”是什么意思。我相信“立即”实际上是允许 SYNSYN-ACKACK 发生的一小段时间。如果它根本不等待,它实际上成功的机会为 0。

所以基本上:

  • 客户端发送一个SYN
  • 等待(阻止)一小段时间(“立即”)以获取 SYN-ACK
  • 完成连接

这样做它会成功返回而不是 EADDRINUSE

现在,当使用线程时,每个线程都这样做,所以没有人等待。它们都只是 connect(2) 并且上下文切换允许每个人几乎同时进行。

关于c - 为什么非阻塞套接字连接这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6730460/

相关文章:

如果用户输入 ' . ',我可以让程序读取 ' , ' 吗?使用 C

c++ - 来自 {Python | 的远程过程调用 ruby | ...} 到 C++

java - IP 作为 Linux 数组元素会抛出 UnknownHostException 但作为常量可以正常工作

android - 如何通过Android应用程序进行USB网络共享?

c - 创建列表过程中出现的问题

c - c 程序从行读取并给出 : the numbers of numbers in the file and the other characters

java - 将 String 转换为 readUTF() 期望的格式

也发送文件的Java聊天程序

C 正确使用 free

c - mmap: map_anonymous 为什么它给 SIGSEGV?