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