在套接字通信中,当服务器接受连接时,如果连接成功,它将返回一个始终大于 0 的值。
ConnectedSocket = accept(sock_desc, (struct sockaddr *)&echoClntAddr,(socklen_t*)&clntSock);
考虑连接到服务器的客户端和分配了数字 1 的服务器。然后客户端断开连接,一段时间后另一个客户端连接。 接受函数会为其分配数字 1 还是数字 2?
如果 accept 函数将分配数字 2,那么在多少个连接之后将再次分配数字 1?
接受调用返回将用于新连接的文件描述符。从接受的手册页:
成功后,这些系统调用将返回一个非负整数,该整数是接受套接字的描述符。出错时,返回 -1,并正确设置 errno
接受永远不会返回 1,因为它是用于标准输出的文件描述符(除非您以编程方式关闭此文件描述符!至于第二个问题:
如果接受函数将分配数字 2,那么在多少个连接之后将再次分配数字 1 ?
接受将使用进程表中第一个未使用的文件描述符。因此,一旦相关的TCP连接关闭,就可以重复使用相同的"返回数字"(文件描述符(。
正确理解了您的问题,您会询问从accept
返回的整数的唯一性。 accept
返回文件描述符,因此如果我们谈论的是 POSIX 操作系统,那么 POSIX 需要:
open(( 函数应返回命名文件的文件描述符 这是当前未打开的最低文件描述符 过程。
accept
内部调用get_unused_fd_flags
,__alloc_fd
调用以生成新的文件描述符,open
以相同的方式生成FD,因此适用于有关FD open
的所有内容都适用于accept
。
因此得出结论:文件描述符可以重用,如果这些文件描述符之前关闭,accept
可以返回重复的数字。