Python の `recvfrom` 関数の使用方法を教えてください。

Pythonでは、recvfromメソッドはソケットからデータを最大受信バイト数で指定して受信します。一般的な構文は次のとおりです。

data, address = socket.recvfrom(buffer_size)

socketはソケットオブジェクト、buffer_sizeは受信する最大バイト数。recvfrom関数は指定されたバイト数を受信するまで、または接続が切断されるまで、プログラムの実行をブロックします。

dataは受信したデータでバイト配列です。addressはデータを送信してきたリモートホストのアドレスとポート番号の組(tuple)です。

以下に簡単な例を示します。

import socket

# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 绑定地址和端口号
server_address = ('localhost', 12345)
sock.bind(server_address)

# 接收数据
data, address = sock.recvfrom(4096)
print('Received', data, 'from', address)

# 关闭套接字
sock.close()

上記の例では、まずUDPソケットを作成し、ローカルのアドレスとポート番号にbindします。次にrecvfrom関数を使用してデータを受信します。最大受信バイト数は4096です。最後に、受信したデータと送信者のアドレスを出力します。

ただし、recvfrom関数が返すデータはバイト配列なので、文字列に変換したい場合はdecodeメソッドを使うとよいでしょう。例えばdata.decode(‘utf-8’)のようにします。

加えて、recvfrom関数はtimeoutパラメータを設定することでタイムアウトを設定可能で、この関数でプログラムがブロックされ続けることを回避できます。例:

sock.settimeout(5)  # 设置超时时间为5秒
data, address = sock.recvfrom(4096)

そのため、5秒以内にデータを受信しなかった場合には、recvfrom関数はsocket.timeout例外をスローします。

bannerAds