• ベストアンサー

非同期接続について質問です

ネットワークプログラミング初心者です。 ただ今、C言語(初心者)にてCUIベースの非同期接続のチャットクライアントプログラムを作成していて困ったことがあります。 fgets関数で、クライアントAの発言を待ち、sendパケットでサーバーに、対してメッセージを送信する形を取っているのですが、こちらが、sendで入力待ちの時に、もう一台のクライアントBから、メッセージが来た時にクライアントAはfgets関数で、待っている状態なので、recv関数処理が出来ていません。ネットで、調べたんですけどWSAAsyncSelect関数を使ってノンブロッキングモードにすれば良い!って書いてあったのですが、関数の構造体引数を見ると、GUIプログラムで使うように見えます。もしこの関数が 使えるなら、どなたかご教授願います。もし使用できないならば、どうしたらいいか教えていただけないでしょうか?  <やりたい事> クライアントAがメッセージ入力待ちの時に、クライアントBがメッセージを送ってきた場合に一時的にクライアントAのメモリ領域に保持して、  クライアントAがメッセージを送信した時にその保持していた、メモリ領域をprintfなどで、出力したいです。 初心者ですが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

ノンブロックIOを使いたいだけならioctlsocket()かWinSock2ならWSAIoctl()で良いのでは。 ノンブロックIOにしてポーリングするとCPU使用率が跳ね上がります。 素直にスレッドを起こすのが一番簡単だと思いますが。

CFW
質問者

お礼

返答ありがとうございます。ioctlsocketという関数は知りませんでした。 ありがとうございます。調べてみます。スレッド関数も使おうと思ったのですが、初心者ながら少しとっつきにくい関数なので、敬遠していました。 ありがとうございました。

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

CUIベースでネットワークなら基本的にselectを使います。 非同期IOやスレッドより扱いやすいと思います。 selectは複数待ちの機能です。複数のfdに対して同時に待つことができますから、コンソールとサーバーの両方に対して待ちデータがきた方を読み取って処理すれば良いです。

関連するQ&A