【问题标题】:Unix sockets: when to use bind() function?Unix 套接字:何时使用 bind() 函数?
【发布时间】:2023-03-27 04:37:01
【问题描述】:

我不清楚何时必须使用 bind() 函数。 我想无论我使用 TCP 还是 UDP,只要我需要接收数据(即 recv() 或 recvfrom() 函数),都应该使用它,但有人告诉我不是这样。

谁能解释一下?

编辑我已经阅读了答案,但实际上我不是很清楚。让我们举一个例子,我有一个 UDP 客户端,它将数据发送到服务器,然后必须得到响应。我必须在这里使用绑定,对吗?

【问题讨论】:

  • 我已编辑答案以添加我需要澄清的示例

标签: c sockets unix


【解决方案1】:

这个答案有点啰嗦,但我认为它会有所帮助。

当我们进行计算机网络时,我们实际上只是在进行进程间通信。假设在您自己的计算机上,您有两个想要相互交谈的程序。您可以使用管道将数据从一个程序发送到另一个程序。当您说ls | grep pdf 时,您正在获取ls 的输出并将其输入grep。这样,lsgrep 两个独立的程序之间就可以进行单向通信了。

执行此操作时,需要有人跟踪每个进程的进程 ID (PID)。该 PID 是每个进程的唯一标识符,它可以帮助我们跟踪我们想要传输的数据的“源”和“目标”进程。

所以现在假设您从网络服务器获得的数据比您想要传输到浏览器的数据。嗯,这和上面的场景是一样的——两个程序之间的进程间通信,“服务器”和“浏览器”。

除了这一次,这两个程序在不同的计算机上。跨两台计算机进行进程间通信的机制称为“套接字”。

太好了。您获取一些数据,将其通过网络传输,然后另一台计算机接收它。除了那台计算机不知道如何处理这些数据。还记得我们说过我们需要一个 PID 来知道哪些进程正在通信吗?在网络中也是如此。当您的计算机收到 HTML 数据时,它如何知道将其发送到“firefox”而不是“pidgin”?

当您传输网络数据时,您指定它在特定的“端口”上传输。 80端口通常用于web,25端口用于telnet,443端口用于HTTPS等。

并且那个“端口”绑定到机器上的特定进程 ID。这就是我们有端口的原因。这就是我们使用bind() 的原因。为了告诉发送者哪个进程应该接收我们的数据。

这应该解释人们发布的答案。如果你是发送者,你并不关心传出端口是什么,所以你通常不会使用bind() 来指定那个端口。如果您是接收者,那么其他人都必须知道在哪里寻找您。所以你bind()你的程序到80端口,然后告诉大家确保在那里传输数据。

要回答您的硬件问题,是的,您可能想为您的服务器使用 bind()。但是客户端不需要使用 bind() - 他们只需要确保将数据传输到您选择的任何端口。

【讨论】:

    【解决方案2】:

    阅读您更新的问题后。我建议在拨打客户电话时不要使用bind() 功能。该函数用于在编写自己的服务器时将套接字(在调用socket() 后创建)绑定到物理地址。

    如需进一步帮助,请查看tutorial

    【讨论】:

      【解决方案3】:

      bind() 在您编写服务器时非常有用,该服务器通过“侦听”已知端口来等待来自客户端的数据。使用bind(),您可以使用相同的套接字设置listen() 的端口。

      如果你写的是客户端,你不需要调用bind()——你可以简单的调用recv()来获取服务器发送过来的数据。建立 TCP 连接后,您的本地端口将设置为“临时”值。

      【讨论】:

        【解决方案4】:

        只要您想绑定到本地地址,就使用bind。您主要使用它来打开特定地址/端口上的侦听套接字,但它也可用于修复传出 TCP 连接的地址/端口。

        【讨论】:

          【解决方案5】:

          您只需要在您的服务器中调用 bind()。尤其是将#port 绑定到您的套接字时需要它。

          【讨论】:

            猜你喜欢
            • 2012-04-21
            • 2021-08-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-10-14
            • 1970-01-01
            • 2014-07-24
            • 2014-08-31
            相关资源
            最近更新 更多