【问题标题】:UDP socket sendto() functionsUDP 套接字 sendto() 函数
【发布时间】:2015-07-27 21:07:29
【问题描述】:

如果我想像这样在我的 udp 套接字上写,我会得到一个错误。 根据文档,应该没有问题。 我不明白为什么 bind() 以同样的方式工作得很好,但 sendto() 失败了。

udp_port = 14550
udp_server  = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udp_server.bind(('127.0.0.1', udp_port))
udp_clients = {}

错误:

udp_server.sendto('', ('192.0.0.1', 14550) )
socket.error: [Errno 22] Invalid argument

【问题讨论】:

  • 你能再粘贴一些上下文吗?你有调用 bind() 吗?
  • 添加绑定代码部分

标签: python sockets sendto


【解决方案1】:

错误表明您的参数无效。阅读您的代码时,我可以说有问题的参数是 IP 地址:

  • 你将你的套接字绑定到127.0.0.1
  • 您尝试将数据发送到 另一个网络上的192.0.0.1

如果您想将数据发送到 IP 地址为 192.0.0.1 的主机,请将套接字绑定到同一网络上的本地网络接口,或者在可以找到到 192.0.0.1 的路由的网络上

我在192.168.56.* 有一个(私有)本地网络,如果我将套接字绑定到192.168.56.x(x 是本地地址),我可以将数据发送到192.168.56.y(y 是服务器的地址);但如果我绑定到127.0.0.1,我会得到IllegalArgumentException

【讨论】:

    【解决方案2】:

    您的绑定调用不应绑定到环回地址。尝试这样做:

    udp_server.bind(('0.0.0.0', udp_port))
    

    【讨论】:

    • 供参考,这里会设置源端口(udp_port),不会设置源地址。一旦根据系统的路由表确定要使用哪个接口/地址,地址字段将由您的网络堆栈自动填写。
    【解决方案3】:

    客户:

    sock_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock_client.sendto("message", ("127.0.0.1", 4444))
    

    服务器:

    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.bind(("127.0.0.1", 4444))
    while(1):
        data, addr = sock.recvfrom(1024)
        print "received:", data
    

    此代码有效。 Python-2.7。

    您似乎混合了客户端和服务器套接字、地址或子网。

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 2011-04-25
      • 1970-01-01
      • 2018-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      相关资源
      最近更新 更多