是否总是需要绑定套接字?

时间:2011-12-26 14:41:41

标签: c linux sockets

好吧,我的问题可能看起来像一个基本的东西,但我是网络编程方面的新手。 我想知道:

1)是否始终需要绑定套接字才能从中接收消息?我看到了一个嗅探器代码(原始套接字),其中一个直接调用recvfrom,另一个代码调用bind然后接收。

2)AF_ *和PF_ *系列有什么区别?后者与POSIX有关吗? 推荐哪一个?

3 个答案:

答案 0 :(得分:9)

不,你不需要绑定()。

如果您正在使用计划连接()或使用sendto()将数据包发送到目标的TCP或UDP套接字,则当您尝试使用时,内核会自动将套接字绑定到合适的端口号连接或发送。这通常是首选方式。 bind()客户端套接字被认为是有害的。

AF_UNIX套接字也是如此 - 客户端不需要绑定,也不应该正常。

答案 1 :(得分:0)

我不了解Linux,但在Windows上,如果在未绑定的套接字上调用recvfrom(),则会因WSAEINVAL错误而失败。

答案 2 :(得分:0)

对于只发送数据的客户端,不需要绑定。

对于向服务器发送请求然后接收响应的客户端,绑定不是必需的。服务器可以使用传入数据来自的 IP 地址和端口号。

对于仅接收数据或在将数据发送回服务器之前正在接收数据的客户端,绑定是必要的。服务器如何知道将数据发送到哪里?从这个意义上说,“客户端”就像一个“服务器”,需要一个地方(绑定端口)来接收数据。