c - Accept() 如何确定返回哪个整数?

标签 c sockets

在 Linux 系统上使用 C 套接字库...

当我调用 accept( ) 时,它总是返回一个整数。 STDIN 是 0。通常我的第一个接受调用返回 3。之后它们会递增。

我想知道; accept( ) 如何确定下一个整数是哪个?如果在另外 2 次 accept( ) 调用之后,我将 3、4 和 5 个分配给已连接的客户端;当4断开连接时会发生什么?下一个整数是 4 还是 6?

如果有人能阐明这一点,我肯定会很感激。

最佳答案

它使用下一个当前未打开的文件描述符,与open()和其他返回文件描述符的系统调用相同; dup2() 是该模式的一个异常(exception)。 (例如,文件描述符可能未打开,但如果它是尚未完全清理的网络连接的一部分,则可能仍然无法重用。)(更新:删除文本恢复原始版本的答案。如果文件描述符关闭,则可以重用。由于 TCP/IP 中的 FIN-WAIT 状态,重用套接字地址可能会出现问题 - 但套接字地址是不是文件描述符。)

如果描述符 1-5 打开,然后关闭 4,则下一个类似打开的操作将返回 4。

可能存在安全意识系统,但这不是模式,但这不太可能。一个原因是有正确的代码来处理 I/O 重定向,该代码依赖于关闭标准输入(文件描述符 0)以及重用文件描述符的下一个类似打开的操作;重复标准输出(文件描述符 1)。

关于c - Accept() 如何确定返回哪个整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6076694/

相关文章:

sockets - 为什么代码显示 "Error 354 (net::ERR_CONTENT_LENGTH_MISMATCH): The server unexpectedly closed the connection."

sockets - Haskell 套接字 recvmsg(路径 mtu 发现)

c# - C#:远程主机上的套接字ReceiveAsync和SendAsync出现问题

c - Turbo C++ 错误地执行条件为文字 0 的循环

c - Euler 22/按字母顺序对名称进行排序

C - fgets 可以接受 NULL 参数吗?

Android:从物理设备连接到模拟器上的套接字服务器

c - 如何在c中打开几个jpg图像?

C-内存重新分配错误

python - ZeroRPC 自动分配空闲端口号