winsockの正しい終了処理について質問があります。
終了時に呼び出すshutdownとclosesocket関数のサーバ側とクライアント側の正しい呼び出し方を確認したいです。
サーバ側では通常、自分のソケットとクライアントのソケットを作成し、
クライアント側では、サーバのソケットを作成し通信していると思います。
ネットで色々調べる限りでは、
サーバ側のコードではクライアントのソケットだけclosesocketしていたり、サーバのソケットだけclosesocketしていたり、
両方closesocketしていたり、どれが正しいのかよく分かりません。
また、クライアント側のコードではサーバのソケットしか作成しないので、それだけをclosesocketするのは分かりますが、
shutdown関数を呼び出していたり、呼び出してなかったりして、どれが正しい終了の仕方なのか分かりません。
このshotdown関数については、サーバ側のコードについても同様です。
さらにこのshotdown関数の第二引数についても、何を指定すればよいのかよく分かっていません。
サーバ側、クライアント側それぞれについて、正しい終了処理をご教示願えますでしょうか?
よろしくお願い致します。
winsockの終了処理について
Re: winsockの終了処理について
なんか、当たり前の事しか回答していないような気もしますが。
サーバ側:
・サーバのソケット(待ち受けソケットのことかな?)→要求の受付を止めたい場合(サーバプログラムを終了する場合)に閉じる
・クライアントのソケット→クライアントとの通信を終了する場合に閉じる
クライアント側:
サーバとの通信を終了する場合に閉じる。
shutdownを使うケースですが、以下のURLが参考になるかも知れません(WinSockではありませんが、原理は同じはずです)。
http://www.kt.rim.or.jp/~ksk/sock-faq/u ... html#ss2.6
私の解釈では以下のような感じです。
・送信のシャットダウン
相手にデータが送り終わったことを通知したいが、自分はデータを受信したい場合に使用する。
ソケットを閉じると、データ送信が終わったことを相手に通知できるが、自分もデータ受信が出来なくなる。
もう少し低レベルな話をすると、相手にFINを送りたい場合にshutdownを使用します。
・受信のシャットダウン
相手のから来るデータを無視したいが、自分は送信したい場合に使用する。
これを使うケースは・・・わかりません^^;
サーバ側:
・サーバのソケット(待ち受けソケットのことかな?)→要求の受付を止めたい場合(サーバプログラムを終了する場合)に閉じる
・クライアントのソケット→クライアントとの通信を終了する場合に閉じる
クライアント側:
サーバとの通信を終了する場合に閉じる。
shutdownを使うケースですが、以下のURLが参考になるかも知れません(WinSockではありませんが、原理は同じはずです)。
http://www.kt.rim.or.jp/~ksk/sock-faq/u ... html#ss2.6
私の解釈では以下のような感じです。
・送信のシャットダウン
相手にデータが送り終わったことを通知したいが、自分はデータを受信したい場合に使用する。
ソケットを閉じると、データ送信が終わったことを相手に通知できるが、自分もデータ受信が出来なくなる。
もう少し低レベルな話をすると、相手にFINを送りたい場合にshutdownを使用します。
・受信のシャットダウン
相手のから来るデータを無視したいが、自分は送信したい場合に使用する。
これを使うケースは・・・わかりません^^;
Re: winsockの終了処理について
追記です。
これが正式かどうかは分かりませんが、私はコネクションを終了させるときには、次のようにやっています。
1.送信コネクションだけshutdown
2.recvでEOFとなるまで読み込む
3.送受信コネクションをshutdown
4.ソケットクローズ
これが正式かどうかは分かりませんが、私はコネクションを終了させるときには、次のようにやっています。
1.送信コネクションだけshutdown
2.recvでEOFとなるまで読み込む
3.送受信コネクションをshutdown
4.ソケットクローズ