【问题标题】:What client-side situations need bind()?哪些客户端情况需要bind()?
【发布时间】:2011-05-06 07:37:17
【问题描述】:

我正在学习 C 套接字编程。什么时候在客户端使用 bind()?什么类型的程序需要它,为什么?在哪里可以找到示例?

【问题讨论】:

  • 请先写出您对此的想法,我们会尽力为您提供指导
  • 像客户端这样的程序从其他机器/服务器/域收集一些信息/消息?

标签: c network-programming sockets


【解决方案1】:

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

【讨论】:

  • @Alexandre Jasmin:不,再读一遍,在活动 FTP 中,FTP 服务器充当数据通道的客户端,绑定到端口 20 并连接到 FTP 客户端上的端口。
【解决方案2】:

在客户端,如果你想使用特定的客户端端口,你只会使用绑定,这很少见。通常在客户端上,您指定服务器机器的 IP 地址和端口,操作系统将选择您将使用的端口。通常你不关心,但在某些情况下,客户端上可能有防火墙,只允许在特定端口上的传出连接。在这种情况下,您需要先绑定到特定端口,然后连接尝试才会起作用。

【讨论】:

  • 我建议你在回答中使用 s/socket number/port/
  • Unix 世界中有一些协议期望客户端从特权端口进行连接。这应该确保连接来自客户端计算机上的特权进程。这是 bind() 在 cient 套接字上的少数实际用例之一,尽管您的系统可能为此具有专用的 rresvport() 函数。
  • 举个更具体的例子来说明@AlexandreJasmin 所说的:与 Linux 内核捆绑在一起的 NFS(网络文件系统)服务器要求客户端使用特权端口进行通信(尽管它可以在服务器端,但默认情况下只需要低编号的端口)。
【解决方案3】:

绑定功能是“关键”功能之一。它将您的套接字(服务器或客户端)与地址(ip + 端口)相关联。对于 Windows,您必须对 WinSockets 使用 bind。 Anthony Jones 和 Jim Ohlund 有一本关于它的好书“Microsoft Windows 的网络编程”。

【讨论】:

  • 您不必bind 一个套接字就可以使用connect
  • 您也不必绑定sendrecv 工作,您只需要一个连接的套接字。
  • ok) 上次我使用套接字可能是 7 年前,大声笑,现在我检查了这本书,我认为你是对的;)对不起,伙计们;)
【解决方案4】:

Bind 可用于将名称附加到套接字。因此,假设您创建了一个使用特定 TCP 端口的软件,您需要绑定它,然后您就会知道它正在使用的 TCP 端口。

【讨论】:

    【解决方案5】:

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

    NFS 协议具有类似的信任关系,同样,客户端使用bind() 从低端口号建立连接。

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

    【讨论】:

      【解决方案6】:

      我想你应该在 UDP 套接字的情况下使用 bind()。

      【讨论】:

        【解决方案7】:

        一个很好的情况是在 p2p 的情况下,你正在与一个带有绑定套接字的 STUN 服务器通信,而 STUN 服务器告诉你他从你的套接字接收消息的端口(这可能与您在绑定套接字时指定的一个,具体取决于您的网络,更具体地说,取决于您的 NAT 类型)。这将使您了解您的 NAT 正在执行的真实端口转换,并且您将能够将此信息提供给想要连接到您的潜在对等方。 绑定套接字很有用,因为某些 NAT 会动态地为您提供端口(在端口 x 上绑定两次可能不会为您提供相同的“真实”端口)。这样你就可以直接使用你绑定的socket监听端口了。

        【讨论】:

          猜你喜欢
          • 2012-10-26
          • 2020-02-01
          • 2011-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多