質問編集履歴
3
bind追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
|
8
8
|
## コード
|
9
9
|
|
10
|
-
```
|
10
|
+
```python3
|
11
11
|
global is_recv
|
12
12
|
|
13
13
|
|
@@ -21,9 +21,10 @@
|
|
21
21
|
|
22
22
|
# マルチキャストJOIN
|
23
23
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
24
|
+
sock.bind('', port)
|
24
25
|
sock.setsockopt(socket.IPPROTO_IP,
|
25
|
-
|
26
|
+
socket.IP_ADD_MEMBERSHIP,
|
26
|
-
|
27
|
+
socket.inet_aton(addr) + socket.inet_aton('0.0.0.0'))
|
27
28
|
|
28
29
|
# 受信
|
29
30
|
while is_recv:
|
@@ -52,6 +53,7 @@
|
|
52
53
|
|
53
54
|
# 終了
|
54
55
|
is_recv = False
|
56
|
+
t.join()
|
55
57
|
print('end: time={}'.format(datetime.now()))
|
56
58
|
```
|
57
59
|
|
2
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -53,4 +53,9 @@
|
|
53
53
|
# 終了
|
54
54
|
is_recv = False
|
55
55
|
print('end: time={}'.format(datetime.now()))
|
56
|
-
```
|
56
|
+
```
|
57
|
+
|
58
|
+
## 追記
|
59
|
+
|
60
|
+
sleepの8秒は決められた値ではなく変動するため、終了時間を予想してtimeoutを設定する、ということはできません。
|
61
|
+
timeoutを0.1秒など小さな値にしてtry~exceptを使用すれば、is_recv=False直後にスレッド終了が可能ですが、Exceptionを大量発生させるのもスマートではないため、他の方法を模索しています。
|
1
誤字
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
socket.recvを強制終了したい
|
1
|
+
python3でsocket.recvを強制終了したい
|
body
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
Python3でマルチキャスト受信するプログラムを作成しているのですが、socket.recvをしている途中で通信を終了したい場合があります。
|
4
4
|
socketにタイムアウトを設定すれば受信タイムアウト発生後に通信終了を判定することができるのですが、受信タイムアウト発生前に割り込んで受信を終了させることはできないでしょうか。
|
5
5
|
例えば以下のコードですと、理想は待機後の8秒で終了することですが、実際はタイムアウトが2回発生した後の10秒後に終了してしまいます。
|
6
|
-
どうにかして8秒で終了させられないでしょうか。よろしくお願いします。
|
6
|
+
どうにかして8秒で強制終了させられないでしょうか。よろしくお願いします。
|
7
7
|
|
8
8
|
## コード
|
9
9
|
|