ページ 11

winsockの終了処理について

Posted: 2010年12月23日(木) 06:49
by Ciel
winsockの正しい終了処理について質問があります。

終了時に呼び出すshutdownとclosesocket関数のサーバ側とクライアント側の正しい呼び出し方を確認したいです。

サーバ側では通常、自分のソケットとクライアントのソケットを作成し、
クライアント側では、サーバのソケットを作成し通信していると思います。

ネットで色々調べる限りでは、
サーバ側のコードではクライアントのソケットだけclosesocketしていたり、サーバのソケットだけclosesocketしていたり、
両方closesocketしていたり、どれが正しいのかよく分かりません。

また、クライアント側のコードではサーバのソケットしか作成しないので、それだけをclosesocketするのは分かりますが、
shutdown関数を呼び出していたり、呼び出してなかったりして、どれが正しい終了の仕方なのか分かりません。
このshotdown関数については、サーバ側のコードについても同様です。
さらにこのshotdown関数の第二引数についても、何を指定すればよいのかよく分かっていません。

サーバ側、クライアント側それぞれについて、正しい終了処理をご教示願えますでしょうか?

よろしくお願い致します。

Re: winsockの終了処理について

Posted: 2010年12月23日(木) 07:29
by Poco
なんか、当たり前の事しか回答していないような気もしますが。
サーバ側:
 ・サーバのソケット(待ち受けソケットのことかな?)→要求の受付を止めたい場合(サーバプログラムを終了する場合)に閉じる
 ・クライアントのソケット→クライアントとの通信を終了する場合に閉じる

クライアント側:
 サーバとの通信を終了する場合に閉じる。

shutdownを使うケースですが、以下のURLが参考になるかも知れません(WinSockではありませんが、原理は同じはずです)。
http://www.kt.rim.or.jp/~ksk/sock-faq/u ... html#ss2.6

私の解釈では以下のような感じです。
 ・送信のシャットダウン
  相手にデータが送り終わったことを通知したいが、自分はデータを受信したい場合に使用する。
  ソケットを閉じると、データ送信が終わったことを相手に通知できるが、自分もデータ受信が出来なくなる。
  もう少し低レベルな話をすると、相手にFINを送りたい場合にshutdownを使用します。
 ・受信のシャットダウン
  相手のから来るデータを無視したいが、自分は送信したい場合に使用する。
  これを使うケースは・・・わかりません^^;

Re: winsockの終了処理について

Posted: 2010年12月23日(木) 07:35
by Poco
追記です。
これが正式かどうかは分かりませんが、私はコネクションを終了させるときには、次のようにやっています。

1.送信コネクションだけshutdown
2.recvでEOFとなるまで読み込む
3.送受信コネクションをshutdown
4.ソケットクローズ

Re: winsockの終了処理について

Posted: 2010年12月23日(木) 07:56
by Ciel
ぽこさん!ありがとうございます!

非常に分かりやすい説明でよく理解できました。
また、よろしくお願いします!