C言語のソケット通信について教えてください。

・ブロッキングは以下の構成でも必要なのでしょうか?
・下記の構成で「ポート1の送受信処理」と「ポート2の送受信処理」が
お互い通信中に影響を及ぼす可能性もあれば教えて下さい。

言語:C言語 winsock
環境:windows8

①クライアント側を作成しています。
②IPアドレスは1個。ポートは2個あります。
③1個目のポートの役割は、クライアント側からデータ送信して、サーバの応答を待ち。
④2個目のポートの役割は、クライアント側はデータを受信待ちし、サーバに応答を返す
⑤③と④間で共有する資源はないものとする。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2017/03/28 00:20:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

ポイント300pt

ブロッキングは不可となることがあっても必要となる事はありません。

ノンブロッキングでも、ループで送受信が成功するまで待つことが出来ますので、ブロッキングが必須になることはないと思います。
むしろ、ごくごく単純な場合以外、途中で送受信を中断出来ないブロッキングモードでは困ることが多いです。

今回の場合もブロッキングモードでは、複数のプロセスかスレッドを使わないと、2つのポートの受信待ちを並行出来ません。
スレッドを使えば受信待ちを並行は出来ますが、通信が途絶するなどしたときは永遠に待ちつづけるため強制終了させる必要がでます。
簡単なものならエラー処理も無視や省略するなどの手抜きとともに、ループの必要のない手軽にブロッキングモードとして、いざという時は強制終了するとか運用でカバーすることもあるかもしれませんが、普通はタイムアウトなども出来るように、ノンブロッキングモードでループで受信待ちをすることが多いです。
http://eternalwindows.jp/network/winsock/winsock04c.html

[追記]
Windowsの場合、かわりにイベントで処理する方法もある様です。
http://eternalwindows.jp/network/winsock/winsock05c.html

id:masariro2014

連絡が遅くなりました・・。
気になったことは、また質問掲示板に投げさせてもらいます。

>スレッドを使えば受信待ちを並行は出来ますが、通信が途絶するなどしたき
>は永遠に待ちつづけるため強制終了させる必要がでます。
確かにそうです。
通信途絶えたときは、スレッド終了して再起動するなどの処理が必要ですね

一つ確認なのですが、
ブロッキングありで、並行で受信待ちしていた場合、
片方が受信中の場合は、もう一方は受信はブロッキングによる
待機状態になるということですか?

2017/04/02 11:58:09

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません