我有一个设置为 listen() 的套接字
通常我会根据通过 select() 准备好的文件描述符来接受()这些连接。我可以将其更改为具有相同文件描述符的 recv() 而不是 accept() 吗?
我有一个设置为 listen() 的套接字
通常我会根据通过 select() 准备好的文件描述符来接受()这些连接。我可以将其更改为具有相同文件描述符的 recv() 而不是 accept() 吗?
不,它们不可互换。
您只使用 监听单个文件描述符,但是一旦连接了客户端,您希望每个连接select
都有一个文件描述符。
accept
提取侦听套接字的挂起连接队列中的第一个连接请求,创建一个新的连接套接字,并返回一个引用该套接字的新文件描述符。
一旦有了新的文件描述符,就可以使用 recv 从客户端接收数据。
帮助我“得到它”的是意识到设置为侦听的套接字仅用于接受连接(并且从不用于来回发送数据),而 accept() 返回的文件描述符用于发送回数据并传给一个特定的客户端(进行连接的客户端),并且在与任何其他客户端交互方面没有用处(包括它在接受来自其他客户端的连接方面没有任何作用)。HTH。
不。
您可能会感到困惑,因为 recv(2) 和 read(2) (大部分)可以互换,但 accept 完全不同。
accept() 返回一对 (conn, address),其中 conn 是一个新的套接字对象,可用于在连接上发送和接收数据,而 address 是绑定到连接另一端套接字的地址。
换句话说,accept() 形成一个新套接字(选择一个新端口)来处理请求,并且使用这个新套接字你可以调用 recv() 和 send()。