web-dev-qa-db-ja.com

Python UDPパケットを送信

https://wiki.python.org/moin/UdpCommunication のように、UDPパケットを送信するプログラムを作成しようとしています。コードは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))

印刷物の周りに括弧を付けると、画面に印刷されます。

この作業を行うには何をする必要がありますか?

36
user2059619

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

あなたのコードは私のためにそのまま動作します。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!
8
Bill Lynch

python 3を実行している場合は、printステートメントを関数を印刷するように変更する必要があります。つまり、printステートメントの後に括弧()で囲みます。

上記のことを確認できるのは、127.0.0.1 port 5005そのままパケットを送信する notreceiveit-したがって、サンプルの他の部分を実装して開始する必要があります別のコンソールウィンドウでfirstので、メッセージを待っています。

2
Steve Barnes

以下は、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
0
pdp