【问题标题】:Python send UDP packetPython发送UDP数据包
【发布时间】:2013-09-15 15:23:34
【问题描述】:

我正在尝试编写一个程序来发送 UDP 数据包,如https://wiki.python.org/moin/UdpCommunication 代码似乎在 Python 2 中:

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = "Hello, World!"

print "UDP target IP:", UDP_IP
print "UDP target port:", UDP_PORT
print "message:", MESSAGE

sock = socket.socket(socket.AF_INET, # Internet
             socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))

如果我在打印的内容周围加上括号,它只会将其打印在屏幕上。

我需要做什么才能完成这项工作?

【问题讨论】:

  • 您是否正在运行示例代码来接收 UDP 数据包?除非您有东西接收数据包,否则它似乎不会做任何事情(除了打印到控制台)。
  • 你在wireshark中看到网络流量了吗?

标签: python sockets


【解决方案1】:

上面的 Manoj 答案是正确的,但另一种选择是使用 MESSAGE.encode() 或 encode('utf-8') 转换为字节。 bytes 和 encode 基本相同,encode 与 python 2 兼容。更多信息请参阅here

完整代码:

import socket

UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = "Hello, World!"

print("UDP target IP: %s" % UDP_IP)
print("UDP target port: %s" % UDP_PORT)
print("message: %s" % MESSAGE)

sock = socket.socket(socket.AF_INET, # Internet
                     socket.SOCK_DGRAM) # UDP
sock.sendto(MESSAGE.encode(), (UDP_IP, UDP_PORT))

【讨论】:

    【解决方案2】:

    这是一个在 CentOS 7 上使用 Python 2.7.5 测试过的完整示例。

    #!/usr/bin/python
    
    import sys, socket
    
    def main(args):
        ip = args[1]
        port = int(args[2])
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        file = 'sample.csv'
    
        fp = open(file, 'r')
        for line in fp:
            sock.sendto(line.encode('utf-8'), (ip, port))
        fp.close()
    
    main(sys.argv)
    

    程序从当前目录读取一个文件sample.csv,并在一个单独的UDP数据包中发送每一行。如果程序保存在名为send-udp 的文件中,则可以通过执行以下操作来运行它:

    $ python send-udp 192.168.1.2 30088
    

    【讨论】:

      【解决方案3】:

      使用 Python3x,您需要将字符串转换为原始字节。您必须将字符串编码为字节。通过网络,您需要发送字节而不是字符。没错,这适用于 Python 2x,因为在 Python 2x 中,套接字上的 socket.sendto 采用“纯”字符串而不是字节。试试这个:

      print("UDP target IP:", UDP_IP)
      print("UDP target port:", UDP_PORT)
      print("message:", MESSAGE)
      
      sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
      sock.sendto(bytes(MESSAGE, "utf-8"), (UDP_IP, UDP_PORT))
      

      【讨论】:

      • 谢谢!我检查了wireshark,它成功发送了一个UDP数据包。 +1 接受的答案。
      • 这仅适用于文本消息。请记住,您可以使用这些函数通过网络传输和接收任意数据,因此您不能总是假设解码/编码为 utf8 是有意义的。
      【解决方案4】:

      如果您运行的是 python 3,那么您需要将 print 语句更改为打印函数,即将内容放在 print 语句之后的括号 () 中。

      您将看到上面所做的唯一一件事就是打印,除非您在 发送数据包而不是 接收它时在 127.0.0.1 port 5005 上监听了一些东西 - 所以您需要在另一个控制台窗口 first 中实现并启动示例的另一部分,因此它正在等待消息。

      【讨论】:

        【解决方案5】:

        您的代码按原样运行。我正在 Linux 上使用 netcat 验证这一点。

        使用 netcat,我可以使用 nc -ul 127.0.0.1 5005 来监听数据包:

        • IP:127.0.0.1
        • 端口:5005
        • 协议:UDP

        话虽如此,这是我在运行脚本时看到的输出,同时运行 netcat。

        [9:34am][wlynch@watermelon ~] nc -ul 127.0.0.1 5005
        Hello, World!
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-07
          • 2012-10-03
          • 2015-04-24
          相关资源
          最近更新 更多