web-dev-qa-db-fra.com

Python envoie un paquet UDP

J'essaie d'écrire un programme d'envoi de paquets UDP, comme dans https://wiki.python.org/moin/UdpCommunication Le code semble être en 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))

Si je mets des parenthèses autour des éléments imprimés, cela les imprime simplement à l'écran.

Que dois-je faire pour que cela fonctionne?

32
user2059619

Avec Python3x, vous devez convertir votre chaîne en octets bruts. Vous devez encoder la chaîne sous forme d'octets. Sur le réseau, vous devez envoyer des octets et non des caractères. Vous avez raison de dire que cela fonctionnerait pour Python 2x car dans Python 2x, socket.sendto sur un socket prend une chaîne "ordinaire" et non pas des octets. Essaye ça:

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))
47
Manoj Pandey

Votre code fonctionne tel quel pour moi. Je vérifie cela en utilisant netcat sur Linux.

Avec netcat, je peux faire nc -ul 127.0.0.1 5005 qui écoutera les paquets sur:

  • IP: 127.0.0.1
  • Port: 5005
  • Protocole: UDP

Ceci étant dit, voici la sortie que je vois lorsque je lance votre script, alors que netcat est en cours d'exécution.

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

Voici un exemple complet qui a été testé avec Python 2.7.5 sur CentOS 7.

#!/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)

Le programme lit un fichier, sample.csv, dans le répertoire actuel et envoie chaque ligne dans un paquet UDP distinct. Si le programme il a été enregistré dans un fichier nommé send-udp, alors on pourrait l’exécuter en faisant quelque chose comme:

$ python send-udp 192.168.1.2 30088
0
pdp