我必须在本地主机上测试带有确认的广播。因此,我有一些表示节点的文本文件,并且在其中有邻居列表。
我使用本地主机作为IP,端口是节点的编号。
问题是当我从7000之类的节点接收到一条消息(我发送的消息)时,python用一个随机数代替了它,例如65724。所以现在我的父亲是65724,而不是7000,所以我无法从邻居列表中删除7000。 。
我无法完成算法,这非常令人沮丧。
我可以发送带有所需端口号的消息,但这不是很优雅。
有人可以告诉我如何不允许python随机化端口吗?
rmunn救了我,我一直在寻找的答案是connect方法之前的bind。在发送消息之前,您绑定自己的端口,然后连接到另一个端口。
本质上,这不是Python问题。您对端口的工作方式感到困惑。
每个TCP通信(发送或接收)都有两个IP地址和两个端口:主机IP和主机端口,以及目标IP和目标端口。
如果您要与网络上“不在那儿”的计算机进行通信,则主机IP和目标IP将有所不同。在您的测试案例中,您的主机IP和目标IP均为127.0.0.1(localhost)。但是,在我的示例中,我将使用“不同IP”的情况,因为这样可以更容易看到。
因此,您的IP地址为10.1.2.3,并且您正在与10.1.2.99处的计算机通信。您告诉系统您想在端口7000上与10.1.2.99通话,它打开了一个连接。发生这种情况时,它将随机选择一个未使用的源端口。因此,现在有一个双向通信渠道开放:
10.1.2.3:65274 <-> 10.1.2.99:7000
请注意,您也不会挑选主机端口。编辑:我最初说:“事实上,该系统不会让你挑主机端口,它会被分配给你”在这里,但这是错误的。如果s
是套接字对象,则可以调用s.bind()
设置其源端口,然后调用s.connect()
以连接到目标端口。
现在,当您正在收听消息时,然后选择您正在收听的端口,与您连接的计算机将具有一个随机端口。因此,如果您正在侦听端口8912上的消息,则传入连接(一旦建立)将如下所示:
10.1.2.3:8912 <-> 10.1.2.99:38290
请注意,计算机的操作系统在10.1.2.99 IP地址上随机选择了38290。
现在使用Python。您在问题标题中提到了套接字,因此我假设您正在使用socket
Python标准库中的模块。创建套接字对象后s
,可使用s.getpeername()
来查找已连接的地址(主机和端口),并s.getsockname()
查找已从其连接的地址(主机和端口)。
由于您谈论的是期望数字7000并获得一个随机数,因此我认为应该在使用目标套接字时使用主机套接字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句