サーバーに接続しているクライアントのソケットが切断された場合、サーバー側で直ちにそれを感知することはできるのでしょうか?
Pythonの問題じゃあなくてネットワークプログラミングの基本です。
参考までに
http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja-2.html#...
ひどいプログラムだけどとりあえず確認は出きるはずです。
サンプルの大本はこちらです。
http://www.tutorialspoint.com/python/python_networking.htm
server.py
#!/usr/bin/env python import socket s = socket.socket() host = socket.gethostname() port = 12345 s.bind((host, port)) s.listen(5) while True: c, addr = s.accept() r = c.recv(1024) print r print len(r) r = c.recv(1024) print r print len(r)
client.py
#!/usr/bin/env python import socket s = socket.socket() host = socket.gethostname() port = 12345 s.connect((host, port)) print s.send("abcdefg") s.close
片方のシェルで先にserver.pyを動かします。
$ ./server.py
次に別のシェルでclient.pyを動かします
$ ./client 7
するとサーバー側は次のようになります。
$ ./server.py abcdefg 7 $
シェルが復帰しているので正しくプログラムが終了している事が分かります。
最後の0でクライアント側からcloseを受け取った事が分かります。
疑うならば次のようにクライアント側を修正します。
#!/usr/bin/env python import socket import time s = socket.socket() host = socket.gethostname() port = 12345 s.connect((host, port)) print s.send("abcdefg") while True: time.sleep(1) #s.close
こうするとサーバー側は次の様に動作するはずです。
$ ./client.py 7
シェルが帰らずに s.send("abcdefg") だけを受信していることが分かるはずです。
ネットワークの挙動を本当に正しく知りたければ、難しいかも知れませんがC言語でのプログラミングをお勧めします。
いまや古い本ですがこの本が詳しいです。
Vol:2はIPCなので今回は必要ないです。
UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI
ありがとうございます。
サンプルまで載せていただきありがとうございます。大変勉強になりました。