【问题标题】:Value returned by accept function in socket communication套接字通信中accept函数返回的值
【发布时间】:2015-09-28 10:36:47
【问题描述】:

在 Socket 通信中,当服务器接受连接时,如果连接成功,它会返回一个始终大于 0 的值。

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

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

如果accept函数会分配2号,那么多少次连接后会再次分配1号?

【问题讨论】:

标签: c sockets file-descriptor


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 出于同样的原因,accept()“通常”不会返回0 或1,它也不会返回2,它用于stderr。再次声明:如果用于stdin、stdout 和stderr(0、1 和2)的这三个描述符得到close()d accept() 也可能会重新使用它们。
  • 我猜你的意思是 2 是标准错误 :)
  • 我可能会说“文件描述符的实际值没有内在含义,除了区分一个文件与另一个文件”。这是一个你应该考虑不要键入的值,如果你这样做了,你必须非常小心地清理你从 fd 键入的任何数据结构。
  • 我同意,特别是当你的程序开始播放 open、close 和 dup 时 :)
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2015-07-08
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多