【问题标题】:Python sockets: [Errno 99] when binding to ip on local networkPython 套接字:[Errno 99] 绑定到本地网络上的 ip 时
【发布时间】:2016-07-05 08:40:36
【问题描述】:

我正在尝试使用 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。没有其他服务正在使用该端口,我尝试了不同的端口,但行为没有改变。如何将我的套接字配置为仅接收来自特定地址的数据包?

【问题讨论】:

    标签: python sockets networking udp


    【解决方案1】:

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

    其次,没有办法“将我的套接字配置为只接收来自特定地址的数据包”。作为替代方案,您可以使用从.recvfrom() 返回的地址来忽略您不关心的数据。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2014-05-10
      • 2011-12-23
      • 2013-01-06
      • 1970-01-01
      • 2016-01-15
      • 2012-06-15
      相关资源
      最近更新 更多