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

时间:2015-09-28 10:36:47

标签: c sockets file-descriptor

在服务器接受连接的Socket通信中,如果连接成功,它将返回一个总是大于0的值。

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

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

如果接受功能将分配编号2,那么在重新分配编号1的连接数之后?

2 个答案:

答案 0 :(得分:4)

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

  

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

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

  

如果接受功能将分配编号2,那么在再次分配编号1的连接数之后?

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

答案 1 :(得分:1)

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

  

open()函数应返回指定文件的文件描述符   这是目前尚未打开的最低文件描述符   过程

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

结论:文件描述符可以重用,accept可以返回重复的数字,如果这些文件描述符早先关闭的话。