套接字通信中accept函数的返回值

Value returned by accept function in socket communication

在 Socket 通信中,当服务器接受连接时,它 returns 如果连接成功,它总是大于 0 的值。

 ConnectedSocket = accept(sock_desc, (struct sockaddr *)&echoClntAddr,(socklen_t*)&clntSock);

考虑连接到服务器的客户端和分配了编号 1 的服务器。 然后客户端断开连接,一段时间后另一个客户端连接。 accept 函数会给它分配数字 1 还是数字 2?

如果accept函数会分配数字2,那么在多少次连接后数字1会再次分配?

accept 调用 return 是一个将用于新连接的文件描述符。来自 accept 的手册页:

On success, these system calls return a nonnegative integer that is a descriptor for the accepted socket. On error, -1 is returned, and errno is set appropriately

接受永远不会 return 1 因为它是用于标准输出的文件描述符(除非您以编程方式关闭此文件描述符!)。至于第二个问题:

If accept function will assign number 2 then after how many connections will number 1 again be assigned ?

accept 将使用进程 table 中第一个未使用的文件描述符。因此,一旦相关的 TCP 连接关闭,就可以重用相同的 "returned number"(文件描述符)。

如果我正确理解了你的问题,你会问 return 来自 accept 的整数的唯一性。 accept returns 文件描述符 所以如果我们谈论 POSIX OS 那么 POSIX 需要:

The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process.

accept 内部调用 get_unused_fd_flags 调用 __alloc_fd 生成新的文件描述符,open 以相同的方式生成 FD 所以适用于 open 的所有内容关于 FD 适用于 accept.

所以结论:文件描述符可以重复使用,如果这些文件描述符较早关闭,accept 可以 return 重复数字。