gpt4 book ai didi

sockets - 为什么在 TCP 中使用 bind()?为什么它只用在服务器端而不用在客户端?

转载 作者:可可西里 更新时间:2023-11-01 02:28:45 26 4
gpt4 key购买 nike

我想知道 bind() 在 TCP 中的确切功能。将本地地址“绑定(bind)”到套接字是什么意思?如果它为套接字分配一个端口号,那我们为什么不在客户端使用它呢?我知道端口是由操作系统在客户端自动分配的,但我并没有全面了解这一切是如何工作的。

在 bind() 之后,我们进行 listen()。绑定(bind)与 listen() 有何关系? listen() 会知道 bind() 已经执行了吗?如果是这样,bind() 做了哪些更改以使其为人所知?我的意思是,返回零对成功执行有何帮助?

我已经了解了很多定义,但我无法从哪里获得所有这些的详细信息。因此,如果有人能向我解释一下,我将不胜感激。

最佳答案

它分配“本地”端的端口号。

对于服务器套接字,这是最终的方法 - 这正是所需要的:例如,将套接字绑定(bind)到 Web 服务器的端口 80。

然而,对于客户端套接字,本地地址和端口通常并不重要。所以你不需要bind()。如果服务器限制其客户端只能使用特定端口号,或超出给定范围的端口号,您也可以在客户端使用 bind()

另一方面,您也可以在未调用 bind() 的套接字上执行 listen()(实际上我不是确定这一点,但这是有道理的)。在这种情况下,您的服务器端口将是随机的,并且服务器进程将通过不同的方式将其端口传递给客户端。想象一个“双连接”协议(protocol),例如 FTP,其中有一个控制连接和一个数据连接。数据连接监听的端口是完全任意的,但必须与另一端通信。因此使用和通信“自动确定的端口”。

Python 中的一个示例:

import socket
s = socket.socket() # create your socket
s.listen(10) # call listen without bind
s.getsockname() Which random port number did we get?
# here results in ('0.0.0.0', 61372)

s2 = socket.socket() # create client socket
s2.connect(('localhost', 61372)) # connect to the one above
s3, x = s.accept() # Python specific use; s3 is our connected socket on the server side
s2.getpeername()
# gives ('127.0.0.1', 61372)
s2.getsockname()
# gives ('127.0.0.1', 54663)
s3.getsockname()
# gives ('127.0.0.1', 61372), the same as s2.getpeername(), for symmetry
s3.getpeername()
#gives ('127.0.0.1', 54663), the same as s2.getsockname(), for symmetry
#test the connection
s2.send('hello')
print s3.recv(10)

关于sockets - 为什么在 TCP 中使用 bind()?为什么它只用在服务器端而不用在客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12763268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com