recv()和accept()是否可以互换?

时间:2012-09-28 21:22:31

标签: c sockets network-programming

我有一个设置为listen()

的套接字

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

4 个答案:

答案 0 :(得分:4)

不,他们不可互换。

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

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

获得新文件描述符后,可以使用recv从客户端接收数据。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

没有

你可能会感到困惑,因为recv(2)和read(2)(大多数)可以互换,但是接受是完全不同的。

答案 3 :(得分:0)

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