winsockの終了処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
Ciel
記事: 252
登録日時: 10年前

winsockの終了処理について

#1

投稿記事 by Ciel » 9年前

winsockの正しい終了処理について質問があります。

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

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

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

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

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

よろしくお願い致します。
oui C'est la Vie♪

Poco
記事: 161
登録日時: 10年前

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

#2

投稿記事 by Poco » 9年前

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

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

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

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

Poco
記事: 161
登録日時: 10年前

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

#3

投稿記事 by Poco » 9年前

追記です。
これが正式かどうかは分かりませんが、私はコネクションを終了させるときには、次のようにやっています。

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

アバター
Ciel
記事: 252
登録日時: 10年前

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

#4

投稿記事 by Ciel » 9年前

ぽこさん!ありがとうございます!

非常に分かりやすい説明でよく理解できました。
また、よろしくお願いします!
oui C'est la Vie♪

閉鎖

“C言語何でも質問掲示板” へ戻る