哪些客户端情况需要bind()?

fri*_*nds 14 c sockets network-programming

我正在学习C套接字编程.你什么时候在客户端使用bind()?需要什么类型的程序以及为什么?我在哪里可以找到一个例子?

Gra*_*row 14

在客户端,如果要使用特定的客户端端口,则只能使用bind,这种情况很少见.通常在客户端上,您指定服务器计算机的IP地址和端口,操作系统将选择您将使用的端口.通常你不在乎,但在某些情况下,客户端上可能有防火墙只允许某些端口上的传出连接.在这种情况下,您需要在连接尝试起作用之前绑定到特定端口.

  • Unix世界中有一些协议期望客户端从特权端口连接.这应该确保连接来自客户端计算机上的特权进程.这是cient socket上`bind()`的少数真实用例之一,尽管你的系统可能有一个专用的`rresvport()`函数. (4认同)
  • 举一个更具体的例子来说明@AlexandreJasmin 所谈论的内容:与 Linux 内核捆绑在一起的 NFS(网络文件系统)服务器要求客户端使用特权端口进行通信(尽管它可以在服务器端进行配置,但默认是只需要低编号的端口)。 (2认同)

nin*_*alj 5

一个示例是活动 FTP 连接的数据连接。在这种情况下,服务器从其端口 20 连接到由 PORT 或 EPRT 命令指定的 IP 和端口。


caf*_*caf 5

客户端程序使用的一个典型示例bind()是(过时的)网络客户端rlogin/系列。rsh这些客户端旨在在具有强信任关系的网络中使用 - 在某些情况下,服务器计算机信任客户端计算机来告诉它正在连接的用户的用户名。这要求客户端程序从低端口(小于1024的端口)连接,因为此类端口仅限于用户root,从而(理论上)证明正在使用的客户端是经过系统管理员授权的。

NFS 协议具有类似的信任关系,同样客户端使用bind().

另一个例子是 IRC 客户端,它允许用户指定要连接的特定源 IP 地址。这是为了容纳分配给其计算机的多个 IP 地址的用户,每个 IP 地址都分配有不同的“虚荣”域名。选择要连接的 IP(使用bind())允许用户选择在 IRC 上显示的域名。