Unix套接字:何时使用bind()函数?

时间:2011-03-03 22:25:45

标签: c sockets unix

我不清楚何时必须使用bind()函数。 我想它应该在我需要接收数据时使用(即recv()或recvfrom()函数),无论我是使用TCP还是UDP,但是有人告诉我情况并非如此。

有人可以澄清一下吗?

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

5 个答案:

答案 0 :(得分:18)

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

当我们进行计算机联网时,我们实际上只是在进行进程间通信。让我们在你自己的计算机上说你有两个想要互相交流的程序。您可以使用管道将数据从一个程序发送到另一个程序。当您说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() - 他们只需要确保将数据传输到您选择的任何端口。

答案 1 :(得分:13)

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

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

Client Server Model

答案 2 :(得分:1)

当您编写通过“侦听”已知端口等待来自客户端的数据的服务器时,

bind()非常有用。使用bind(),您可以使用相同的套接字设置listen()的端口。

如果您正在编写客户端,则不需要调用bind() - 您只需调用recv()即可获取从服务器发送的数据。建立TCP连接后,您的本地端口将设置为“临时”值。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您只需要在服务器中调用bind()。特别需要将#port绑定到套接字。