【发布时间】:2011-05-06 07:37:17
【问题描述】:
我正在学习 C 套接字编程。什么时候在客户端使用 bind()?什么类型的程序需要它,为什么?在哪里可以找到示例?
【问题讨论】:
-
请先写出您对此的想法,我们会尽力为您提供指导
-
像客户端这样的程序从其他机器/服务器/域收集一些信息/消息?
标签: c network-programming sockets
我正在学习 C 套接字编程。什么时候在客户端使用 bind()?什么类型的程序需要它,为什么?在哪里可以找到示例?
【问题讨论】:
标签: c network-programming sockets
一个示例是活动 FTP 连接的数据连接。在这种情况下,服务器从其端口 20 连接到由 PORT 或 EPRT 命令指定的 IP 和端口。
【讨论】:
在客户端,如果你想使用特定的客户端端口,你只会使用绑定,这很少见。通常在客户端上,您指定服务器机器的 IP 地址和端口,操作系统将选择您将使用的端口。通常你不关心,但在某些情况下,客户端上可能有防火墙,只允许在特定端口上的传出连接。在这种情况下,您需要先绑定到特定端口,然后连接尝试才会起作用。
【讨论】:
bind() 在 cient 套接字上的少数实际用例之一,尽管您的系统可能为此具有专用的 rresvport() 函数。
绑定功能是“关键”功能之一。它将您的套接字(服务器或客户端)与地址(ip + 端口)相关联。对于 Windows,您必须对 WinSockets 使用 bind。 Anthony Jones 和 Jim Ohlund 有一本关于它的好书“Microsoft Windows 的网络编程”。
【讨论】:
bind 一个套接字就可以使用connect
send 和recv 工作,您只需要一个连接的套接字。
Bind 可用于将名称附加到套接字。因此,假设您创建了一个使用特定 TCP 端口的软件,您需要绑定它,然后您就会知道它正在使用的 TCP 端口。
【讨论】:
使用bind() 的客户端程序的典型示例是(过时的)rlogin / rsh 系列网络客户端。这些客户端旨在用于具有强信任关系的网络 - 在某些情况下,服务器机器信任客户端机器以告诉它正在连接的用户的用户名。这要求客户端程序从低端口(小于 1024 的端口)连接,因为此类端口仅限于 root 用户,因此(理论上)证明正在使用的客户端是由系统管理员授权的。
NFS 协议具有类似的信任关系,同样,客户端使用bind() 从低端口号建立连接。
另一个例子是 IRC 客户端,它允许用户指定一个特定的源 IP 地址进行连接。这是为了容纳分配给他们机器的许多 IP 地址的用户,每个 IP 地址都分配有不同的“虚”域名。选择从哪个 IP 连接(使用bind())允许用户选择在 IRC 上显示的域名。
【讨论】:
我想你应该在 UDP 套接字的情况下使用 bind()。
【讨论】:
一个很好的情况是在 p2p 的情况下,你正在与一个带有绑定套接字的 STUN 服务器通信,而 STUN 服务器告诉你他从你的套接字接收消息的端口(这可能与您在绑定套接字时指定的一个,具体取决于您的网络,更具体地说,取决于您的 NAT 类型)。这将使您了解您的 NAT 正在执行的真实端口转换,并且您将能够将此信息提供给想要连接到您的潜在对等方。 绑定套接字很有用,因为某些 NAT 会动态地为您提供端口(在端口 x 上绑定两次可能不会为您提供相同的“真实”端口)。这样你就可以直接使用你绑定的socket监听端口了。
【讨论】: