我不清楚何时必须使用bind()函数。 我想它应该在我需要接收数据时使用(即recv()或recvfrom()函数),无论我是使用TCP还是UDP,但是有人告诉我情况并非如此。
有人可以澄清一下吗?
编辑我已经阅读了答案,但实际上我并不是那么清楚。让我们举一个例子,我有一个UDP客户端,它将数据发送到服务器然后必须得到响应。我必须在这里使用bind,对吧?
答案 0 :(得分:18)
这个答案有点啰嗦,但我认为这会有所帮助。
当我们进行计算机联网时,我们实际上只是在进行进程间通信。让我们在你自己的计算机上说你有两个想要互相交流的程序。您可以使用管道将数据从一个程序发送到另一个程序。当您说ls | grep pdf
时,您正在获取ls
的输出并将其输入grep
。通过这种方式,您可以在两个单独的程序ls
和grep
之间进行单向通信。
执行此操作时,需要有人跟踪每个进程的进程ID(PID)。该PID是每个流程的唯一标识符,它可以帮助我们跟踪“源”和“目标”流程对于我们要传输的数据的用户。
现在假设您拥有来自网络服务器的数据,而不是您想要传输到浏览器的数据。嗯,这与上面的情况相同 - 两个程序之间的进程间通信,“服务器”和“浏览器”。
除此之外,这两个程序在不同的计算机上。跨两台计算机进行进程间通信的机制称为“套接字”。
太好了。你拿一些数据,通过电线吊起它,另一台电脑收到它。除了计算机不知道如何处理该数据。记得我们说我们需要一个PID来知道哪些进程正在通信?网络也是如此。当您的计算机收到HTML数据时,如何将其发送到“firefox”而不是“pidgin”?
当您传输网络数据时,您可以指定它在特定的“端口”上运行。端口80通常用于Web,端口25用于telnet,端口443用于HTTPS等。
该“端口”绑定到计算机上的特定进程ID。这就是我们拥有港口的原因。这就是我们使用bind()
的原因。为了告诉发件人哪个进程应该接收我们的数据。
这应该解释人们发布的答案。如果您是发件人,则不关心传出端口是什么,因此您通常不使用bind()
来指定该端口。如果你是接收者,那么其他人都必须知道在哪里寻找你。所以你bind()
你的程序移植80,然后告诉大家确保在那里传输数据。
要回答您的问题,是的,您可能希望将bind()用于您的服务器。但客户端不需要使用bind() - 他们只需要确保将数据传输到您选择的任何端口。
答案 1 :(得分:13)
答案 2 :(得分:1)
bind()
非常有用。使用bind()
,您可以使用相同的套接字设置listen()
的端口。
如果您正在编写客户端,则不需要调用bind()
- 您只需调用recv()
即可获取从服务器发送的数据。建立TCP连接后,您的本地端口将设置为“临时”值。
答案 3 :(得分:1)
只要您想绑定到本地地址,就可以使用bind
。您主要使用它来打开特定地址/端口上的侦听套接字,但它也可用于修复传出TCP连接的地址/端口。
答案 4 :(得分:0)
您只需要在服务器中调用bind()。特别需要将#port绑定到套接字。