人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

pythonでselectを使ってechoサーバーを書いています。
サーバーに接続しているクライアントのソケットが切断された場合、サーバー側で直ちにそれを感知することはできるのでしょうか?


●質問者: ojosamacut
●カテゴリ:コンピュータ インターネット
✍キーワード:echo Python SELECT クライアント サーバー
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● longicorn
●100ポイント ベストアンサー

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

UNIXネットワークプログラミング〈Vol.1〉ネットワークAPI:ソケットとXTI

  • 作者: W.リチャード スティーヴンス
  • 出版社/メーカー: ピアソンエデュケーション
  • メディア: 単行本

◎質問者からの返答

ありがとうございます。

サンプルまで載せていただきありがとうございます。大変勉強になりました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ