accept()如何确定返回哪个整数?

时间:2011-05-20 19:25:19

标签: c sockets

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

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

我在想; accept( )如何确定下一个整数?如果再经过2次accept( )次呼叫,我将3,4和5分配给连接的客户端;当4断开时会发生什么?是下一个整数4还是6?

如果有人可以对此有所了解,我当然会很感激。

3 个答案:

答案 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.

这为您提供了一个数值,您可以在各种文件操作中使用什么值,并在幕后决定。