IPv6でUDPを使って大きいデータを送信することが目的のようですので簡単なソースコードを示します。
python
1# server.py
2import socket
3
4BUF_SIZE = 1024
5
6ipv6_ip = "::"
7port = 10000
8
9sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
10sock.bind((ipv6_ip, port))
11
12with open("test.dat", "wb") as f:
13 while True:
14 data, addr = sock.recvfrom(BUF_SIZE)
15 if len(data) > 0:
16 f.write(data)
17 if len(data) < BUF_SIZE:
18 break
python
1# client.py
2import socket
3import argparse
4
5BUF_SIZE = 1024
6
7
8parser = argparse.ArgumentParser()
9parser.add_argument("filename")
10args = parser.parse_args()
11
12ipv6_ip = "::1"
13port = 10000
14
15sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
16
17with open(args.filename, "rb") as f:
18 while True:
19 data = f.read(BUF_SIZE)
20 if len(data) > 0:
21 sock.sendto(data, (ipv6_ip, port))
22 if len(data) < BUF_SIZE:
23 break
使い方は
terminal
1python server.py
でサーバを立ち上げクライアントからの接続を待ち受けた状態で
terminal
1python client.py filename
とクライアントでファイル送信します。
このプログラムには問題があり、比較的大きなファイルを送信すると正しく送信できません。TCPと異なりパケットの順序制御がされていないのとパケットロスによるものです。したがってUDPを使ってファイル転送をするためには分割したデータの順序付けやパケットロス時の再送要求などソフトウェア側で実装する必要があります。
このような制御を行うサンプルプログラムへのリンクを貼ります。IPv4になりますが参考になると思います。
またUDPで高速にデータ伝送するためにHTTP/3(QUIC)が参考になると思います。