Python 套接字:绑定到本地网络上的 ip 时出现 [Errno 99]
Python sockets: [Errno 99] when binding to ip on local network
我正在尝试使用 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()
但是,绑定到 ''
会使接收代码接受来自任何本地接口的数据包。如果我尝试专门绑定到发送机器的 IP 地址(在接收代码中将 HOST = ''
更改为 HOST = '192.168.1.130'
),我会得到一个 socket.error: [Errno 99] Cannot assign requested address
。没有其他服务正在使用该端口,我尝试了不同的端口,但行为没有变化。如何配置我的套接字只接收来自特定地址的数据包?
首先,让我们来处理您看到的错误。 .bind()
命名套接字的 local 端,而不是远程端。所以主机部分必须引用本地机器(例如,'localhost'
、'127.0.0.1
、'192.168.1.194'
或 ''
(所有本地接口的通配符)。)所以,当你指定一个不是机器本地的地址 运行 .bind()
,你会得到一个错误。
其次,没有办法 "configure my socket to only receive packets from a specific address." 作为替代方案,您可以使用从 .recvfrom()
返回的地址来忽略您不关心的数据。
data, addr = s.recvfrom(1024)
if addr != '192.168.1.130':
continue
我正在尝试使用 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()
但是,绑定到 ''
会使接收代码接受来自任何本地接口的数据包。如果我尝试专门绑定到发送机器的 IP 地址(在接收代码中将 HOST = ''
更改为 HOST = '192.168.1.130'
),我会得到一个 socket.error: [Errno 99] Cannot assign requested address
。没有其他服务正在使用该端口,我尝试了不同的端口,但行为没有变化。如何配置我的套接字只接收来自特定地址的数据包?
首先,让我们来处理您看到的错误。 .bind()
命名套接字的 local 端,而不是远程端。所以主机部分必须引用本地机器(例如,'localhost'
、'127.0.0.1
、'192.168.1.194'
或 ''
(所有本地接口的通配符)。)所以,当你指定一个不是机器本地的地址 运行 .bind()
,你会得到一个错误。
其次,没有办法 "configure my socket to only receive packets from a specific address." 作为替代方案,您可以使用从 .recvfrom()
返回的地址来忽略您不关心的数据。
data, addr = s.recvfrom(1024)
if addr != '192.168.1.130':
continue