• ベストアンサー

非同期関数とノンブロッキング関数について(winsock)

こんばんわ。 VC++.NETにてコンソール上でソケットプログラミングをしています。 非同期モードとノンブロッキング関数について知りたいのですが、私は、今までTCPやUDPでsendtoやsend関数を使用してきました。しかし、非同期やノンブロッキング関数があることを知り、詳しく知りたいと思っています。 1.非同期やノンブロッキング関数はGUI作成を行う上では重要であるが、コンソール上でプログラミングを行っている場合は利用しなくてよいのでしょうか? 2.以下のWSAAsyncSelect関数の第2引数の設定がわかりません。サンプルでは、hwndに関連付けられたウィンドウがSM_EVENTメッセージを受け取りますと記述されていますが、ウィンドウを利用していないコンソールアプリでの記述方法はありますでしょうか? HWND hwnd; WSAAsyncSelect(Sock,hwnd,SM_EVENT,FD_WRITE); と記述し実行した場合、強制終了されてしまいます。 3.たとえば、送信側から送信したパケットを受信側で受信し、再度受信側から送信側へ送信する場合を考えると、 送信側で送信と受信が必要です。この場合、マルチスレッド処理が必要だと思うのですが、非同期のFD_WRITEとFD_READを使うことで、シングルスレッドで実現可能でしょうか? よろしくお願い致します。

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

  • ベストアンサー
  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.2

>>送信側で送信と受信が必要です。この場合、マルチスレッド処理が必要だと思うのですが、非同期のFD_WRITEとFD_READを使うことで、シングルスレッドで実現可能でしょうか? .NETは使ったことないのですが、以前Windowsのソケットプログラムを作るとき調べたら、「Windowsでは、Socketをマルチスレッドで使えない。ライブラリでグローバルに取られている変数があるから」って記載のある文献を目にしました。 .Netでは違うかもしれませんが・・・。 また、No.1の方の回答にあるように、Selectを使えば、送受信のデータ状況がわかるため、マルチスレッドにする必要はないです。というか、マルチスレッドにするとSelectが正常動作しないのでは? 補足ですが、socket関連の文献ってちょっと少なめで、しかもコードは「お勉強用」っていうものが多い気がします。まあ、勉強のコードに異常対応をきちんと入れたら、本筋が見えなくなる気もします。でも、socket関連の処理って異常処理が当たり前のように発生しますので、実用に耐えるレベルのコードは、「全てのエラーに完全対応する」っていうつもりで、状態遷移図を完成させてからコードを作成されるといいと思います。

bird0214
質問者

お礼

返信ありがとうございます。 socketの文献って少ないですね・・・とくにwindowsソケットは。 もともと、UNIX?で開発されてきたから仕方ないのでしょうか・・ ありがとうございました。

その他の回答 (2)

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

コンソールアプリケーションならselectを使えば良いかと。これならUNIXでも使える標準的な関数だしWinSockでも使えるでしょう。非同期もノンブロッキングもなしに通信の多重化ができます。 Windowハンドルを要求するAPIをコンソールアプリケーションで使うのは適切とは考えられません。

bird0214
質問者

お礼

返信ありがとうございます。 select関数を用いることで、送信スレッドおよび受信スレッドのマルチスレッド化をしなくても、シングルスレッドで送信受信が可能であるのですね。 参考にさせていただきます。 ありがとうございました。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.1

>1.非同期やノンブロッキング関数はコンソール上で利用しなくてよいのでしょうか? >2.ウィンドウを利用していないコンソールアプリでの記述方法はありますでしょうか? WSAAsyncSelectを使う場合は必ずウインドウハンドルが必要です。 コンソールアプリであってもCreateWindow等を使って非表示のウインドウでも作れば不可能ではありませんが メインループ及びWndProcが必要になります。WndProcがないとイベントを検知できませんから。 ただコンソールアプリの場合、別スレッドをたててWSAEventSelect等を使う方が普通だと思います。 >3.非同期のFD_WRITEとFD_READを使うことで、シングルスレッドで実現可能でしょうか? 可能です。というかWSAAsyncSelectを使う場合、別スレッドは不要です。

bird0214
質問者

お礼

返信ありがとうございます。 お返事が遅れまして、大変申し訳ありません。 ありがとうございました。

関連するQ&A