在Linux系统上使用C套接字库...
当我调用accept( )
时,它总是返回一个整数。 STDIN
为0.通常我的第一个接受调用返回3.它们在此之后递增。
我在想; accept( )
如何确定下一个整数?如果再经过2次accept( )
次呼叫,我将3,4和5分配给连接的客户端;当4断开时会发生什么?是下一个整数4还是6?
如果有人可以对此有所了解,我当然会很感激。
答案 0 :(得分:3)
它使用下一个当前未打开的文件描述符,与open()
和返回文件描述符的其他系统调用相同; dup2()
是模式的一个例外。 (例如,文件描述符可能未打开,但如果它是尚未完全清理的网络连接的一部分,则可能仍然无法重用。)( Update :删除文本恢复原始版本的答案。如果文件描述符已关闭,则可以重复使用。由于TCP / IP中的FIN-WAIT状态,可能存在重用套接字地址的问题 - 但是套接字地址是不是文件描述符。)
如果您打开描述符1-5,然后关闭4,则下一个类似打开的操作将返回4.
可能存在安全意识系统,这不是模式,但不太可能。一个原因是有正确的代码用于处理依赖于关闭标准输入(文件描述符0)的I / O重定向以及重用文件描述符的下一个类似开放的操作;重复标准输出(文件描述符1)。
答案 1 :(得分:2)
简短的回答是,不要指望以任何预期的顺序给你整数。无论多么诱人的容易,你都会认为如果有的话会让事情发生。
返回什么是实际上是内核资源的'描述符',它将该描述符连接到读写,关闭,搜索(如果有能力)所需的适当驱动程序。可用描述符池是有限的,因此当您关闭套接字时,其描述符将返回池中并可以重用。
答案 2 :(得分:0)
它正在返回已接受套接字的文件描述符:
RETURN VALUES
The call returns -1 on error and the global variable errno is set to
indicate the error. If it succeeds, it returns a non-negative integer
that is a descriptor for the accepted socket.
这为您提供了一个数值,您可以在各种文件操作中使用什么值,并在幕后决定。