1

我有一个设置为 listen() 的套接字

通常我会根据通过 select() 准备好的文件描述符来接受()这些连接。我可以将其更改为具有相同文件描述符的 recv() 而不是 accept() 吗?

4

4 回答 4

5

不,它们不可互换。

您只使用 监听单个文件描述符,但是一旦连接了客户端,您希望每个连接select都有一个文件描述符。

accept提取侦听套接字的挂起连接队列中的第一个连接请求,创建一个新的连接套接字,并返回一个引用该套接字的新文件描述符

一旦有了新的文件描述符,就可以使用 recv 从客户端接收数据。

于 2012-09-28T21:29:42.580 回答
0

帮助我“得到它”的是意识到设置为侦听的套接字仅用于接受连接(并且从不用于来回发送数据),而 accept() 返回的文件描述符用于发送回数据并传给一个特定的客户端(进行连接的客户端),并且在与任何其他客户端交互方面没有用处(包括它在接受来自其他客户端的连接方面没有任何作用)。HTH。

于 2012-09-28T21:51:07.043 回答
0

不。

您可能会感到困惑,因为 recv(2) 和 read(2) (大部分)可以互换,但 accept 完全不同。

于 2012-09-28T22:00:15.187 回答
0

accept() 返回一对 (conn, address),其中 conn 是一个新的套接字对象,可用于在连接上发送和接收数据,而 address 是绑定到连接另一端套接字的地址。
换句话说,accept() 形成一个新套接字(选择一个新端口)来处理请求,并且使用这个新套接字你可以调用 recv() 和 send()。

于 2020-03-16T12:47:49.933 回答