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?
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))
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:
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!
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