代码之家  ›  专栏  ›  技术社区  ›  Abhishek Sagar

Socket编程中listen()的目的是什么?

  •  0
  • Abhishek Sagar  · 技术社区  · 5 年前

    ret = listen(connection_socket, 1); //允许队列中有一个连接

    我打开了2个终端,并在所有2个终端中同时运行客户端进程。

    这里服务器正忙于处理client1数据,现在client2处于挂起队列中。现在队列已满。

    在这个阶段,我已经启动了第三个终端并运行了客户端进程。由于队列已满,此客户端的连接应返回-1,errno应设置为ECONNREFUSED, 但在这种情况下,客户端3的connect也返回0。那么,其目的是什么 listen() 系统调用。

    1 回复  |  直到 5 年前
        1
  •  7
  •   selbie    5 年前

    listen 告诉TCP/IP堆栈开始接受套接字绑定到的端口上的传入TCP连接。

    backlog参数不是“允许的最大连接数”参数。相反,它只是向堆栈提示在应用程序代码调用之前,套接字端口上可以接受多少TCP连接 accept 在那个插座上。请注意 接受 它不协商TCP握手,它只是从积压队列中取出一个已经接受的连接(或等待一个连接到达)。

    因此,如果你的待办事项列表为1,而你的服务器线程没有在等待 接受 ,这意味着传入的客户端连接将至少建立TCP握手。如果在积压队列为1时尝试有两个挂起的连接,如果服务器代码没有主动调用,则第二个客户端连接可能会超时或被拒绝 接受 将这些连接从待办事项列表中提升到套接字中。