質問するログイン新規登録

質問編集履歴

3

bind追加

2019/04/04 05:07

投稿

y.nakamura
y.nakamura

スコア190

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
- socket.IP_ADD_MEMBERSHIP,
26
+ socket.IP_ADD_MEMBERSHIP,
26
- socket.inet_aton(addr) + socket.inet_aton('0.0.0.0'))
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

追記

2019/04/04 05:07

投稿

y.nakamura
y.nakamura

スコア190

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

誤字

2019/04/02 23:54

投稿

y.nakamura
y.nakamura

スコア190

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