2015-09-28 74 views
4

在服务器接受连接的Socket通信中,如果连接成功,它将返回一个始终大于0的值。在套接字通信中由接受函数返回的值

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

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

如果接受功能将分配数字2,那么在多少个连接之后将数字1再次分配?

+1

'accept()'也可能返回'0'。 – alk

+0

相关:http://stackoverflow.com/q/880557/694576 – alk

+0

为什么你关心接受返回值的唯一性? – zoska

回答

3

accept调用返回将用于新连接的文件描述符。从接受的手册页:

成功时,这些系统调用会返回一个非负整数,它是接受套接字的描述符。出现错误时,返回-1,并且适当设置errno

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

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

accept将使用进程表中第一个未使用的文件描述符。因此,一旦相关的TCP连接关闭,就可以重新使用相同的“返回号码”(文件描述符)。

+0

出于同样的原因,'accept()'“通常”不会返回0或1,它也不会返回2,它用于'stderr'。再次说明:如果用于'stdin','stdout'和'stderr'('0','1'和'2')的三个描述符得到'close()'''accept()'也可能-使用它们。 – alk

+0

我想你的意思是2是stderr :) – redobot

+0

糟糕,当然。谢谢,更正! – alk

1

如果我正确理解你的问题,你可以询问从accept返回的整数的唯一性。 accept返回文件描述符,所以如果我们谈论的POSIX操作系统,那么POSIX要求:

的open()函数应命名文件 是最低的文件描述符目前没有开放为 进程返回一个文件描述符。

accept内部调用get_unused_fd_flags这就要求__alloc_fd生成新的文件描述符,open产生FD同样的方式,以便适用于open关于文件描述符适用于accept一切。

所以结论是:文件描述符可以被重用,并且accept可以返回重复的数字,前提是这些文件描述符被关闭。