質問編集履歴
1
ソースコードの修正(ソケット生成部分などの追加)
test
CHANGED
File without changes
|
test
CHANGED
@@ -16,29 +16,97 @@
|
|
16
16
|
10つのクライアントからUDPを受信しようと考えているため,def main()内のfor処理を10回繰り返し,10個のタスクを生成しています.
|
17
17
|
|
18
18
|
|
19
|
+
※主にソケット生成/受信/送信部分を見てもらえればよいと思います.
|
20
|
+
|
19
21
|
```async.py
|
22
|
+
import socket
|
20
|
-
import
|
23
|
+
import asyncio
|
21
24
|
|
22
|
-
# socketの生成は省略
|
23
25
|
|
24
|
-
async def recvDataOnUDP():
|
25
|
-
|
26
|
+
M_Group = "239.1.2.3"
|
26
|
-
|
27
|
+
LOCALHOST = socket.gethostbyname(socket.gethostname())
|
28
|
+
PORT = 1234
|
27
29
|
|
30
|
+
|
31
|
+
FILE_NAME = 'send.txt'
|
32
|
+
|
33
|
+
# UDPソケットの設定
|
34
|
+
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
35
|
+
udp_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(LOCALHOST))
|
36
|
+
udp_sock.setsockopt(
|
37
|
+
socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
|
38
|
+
socket.inet_aton(M_Group) + socket.inet_aton(LOCALHOST)
|
39
|
+
)
|
40
|
+
# 自分の送ったマルチキャストパケットを自身で受け取らない
|
41
|
+
udp_sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 0)
|
42
|
+
udp_sock.bind(('', PORT))
|
43
|
+
udp_sock.settimeout(5)
|
44
|
+
|
45
|
+
# udp_sock.connect((M_Group, PORT))
|
46
|
+
|
47
|
+
# TCPソケットの設定
|
48
|
+
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
49
|
+
|
50
|
+
|
51
|
+
file_data = ""
|
52
|
+
len_data = 0
|
53
|
+
|
54
|
+
with open(FILE_NAME, 'r') as f:
|
55
|
+
file_data = f.read()
|
56
|
+
len_data = len(file_data)
|
57
|
+
|
58
|
+
|
59
|
+
async def recv_loss_packet():
|
60
|
+
|
61
|
+
print("time to wait for response...")
|
62
|
+
try:
|
63
|
+
res_data, (src_ip, src_port) = udp_sock.recvfrom(1024)
|
64
|
+
|
65
|
+
print(f'src_ip: {src_ip}, src_port: {src_port}')
|
66
|
+
|
67
|
+
|
68
|
+
# packet loss seq split
|
69
|
+
recv_seq_ary = res_data.decode().split(",")
|
70
|
+
recv_seq_ary.pop(-1)
|
71
|
+
|
72
|
+
recv_seq_ary = list(map(int, recv_seq_ary))
|
73
|
+
print(recv_seq_ary)
|
74
|
+
|
75
|
+
# packet loss data resend
|
28
|
-
tcp
|
76
|
+
tcp_sock.connect((src_ip, src_port))
|
77
|
+
|
78
|
+
for i in recv_seq_ary:
|
79
|
+
chunk = file_data[i*10:i*10+10]
|
80
|
+
chunk = str(i) + ":" + chunk
|
81
|
+
print(chunk)
|
82
|
+
|
29
|
-
tcp
|
83
|
+
tcp_sock.send(chunk.encode())
|
84
|
+
|
85
|
+
except:
|
86
|
+
print(f"Timeout!")
|
30
87
|
|
31
88
|
|
32
89
|
async def main():
|
33
|
-
|
90
|
+
count = 0
|
34
91
|
|
92
|
+
# データを指定バイトごとに分割
|
93
|
+
chunks = [file_data[i:i+10] for i in range(0, len_data, 10)]
|
94
|
+
|
95
|
+
for chunk in chunks:
|
96
|
+
count+=1
|
97
|
+
chunk = str(count) + ":" + chunk
|
98
|
+
print(chunk)
|
99
|
+
|
100
|
+
udp_sock.sendto(chunk.encode(), (M_Group, PORT))
|
101
|
+
time.sleep(0.05)
|
102
|
+
|
35
|
-
|
103
|
+
for i in range(10):
|
36
|
-
#タスクを生成する
|
37
|
-
|
104
|
+
asyncio.create_task(recv_loss_packet())
|
38
105
|
|
39
106
|
await asyncio.sleep(10)
|
40
107
|
|
41
108
|
asyncio.run(main())
|
109
|
+
|
42
110
|
```
|
43
111
|
|
44
112
|
### 試したこと
|