質問編集履歴

1

ソースコードの修正(ソケット生成部分などの追加)

2022/12/21 03:02

投稿

Yochyee
Yochyee

スコア2

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 uasyncio as asyncio
23
+ import asyncio
21
24
 
22
- # socketの生成は省略
23
25
 
24
- async def recvDataOnUDP():
25
- print("受信を待機中...")
26
+ M_Group = "239.1.2.3"
26
- resData, (sourceIp, sourcePort) = udpSock.recvfrom(1024)
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
- tcpClient.connect((sourceIp, sourcePort))
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
- tcpClient.send(resData)
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
-   for i in range(10):
103
+ for i in range(10):
36
-   #タスクを生成する
37
-   asyncio.create_task(recvDataOnUDP())
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
  ### 試したこと