我正在尝试使用python套接字库在本地网络上的两个Linux机器之间设置UDP单播。我设法使用以下代码发送和接收包裹:

发送

import socket

HOST = '192.168.1.194' # IP of remote machine
PORT = 47808

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto('Hello UDP', (HOST, PORT))
s.close()

接收
import socket

HOST = ''
PORT = 47808

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, PORT))
while True:
    try:
        data, addr = s.recvfrom(1024)
        print 'Received: {0} @ {1}'.format(data, addr)
    except KeyboardInterrupt:
        break
s.close()

但是,绑定(bind)到''会使接收代码接受来自任何本地接口(interface)的数据包。如果我尝试专门绑定(bind)到发送方的IP地址(将接收代码中的HOST = ''更改为HOST = '192.168.1.130'),则会收到socket.error: [Errno 99] Cannot assign requested address。没有其他服务在使用该端口,并且我尝试了其他端口,但性能没有变化。如何将我的套接字配置为仅接收来自特定地址的数据包?

最佳答案

首先,让我们处理您看到的错误。 .bind()命名套接字的本地端,而不是远程端。因此,主机部分必须引用本地计算机(例如'localhost''127.0.0.1'192.168.1.194'''(所有本地接口(interface)的通配符)。)因此,当您指定的地址不是运行.bind()的计算机的本地地址时,一个错误。

其次,没有办法“将我的套接字配置为仅接收来自特定地址的数据包”。或者,您可以使用.recvfrom()返回的地址来忽略不需要的数据。

data, addr = s.recvfrom(1024)
if addr != '192.168.1.130':
    continue

10-07 19:37
查看更多