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