
こんばんわ。
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を使うことで、シングルスレッドで実現可能でしょうか?
よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
>>送信側で送信と受信が必要です。
この場合、マルチスレッド処理が必要だと思うのですが、非同期のFD_WRITEとFD_READを使うことで、シングルスレッドで実現可能でしょうか?.NETは使ったことないのですが、以前Windowsのソケットプログラムを作るとき調べたら、「Windowsでは、Socketをマルチスレッドで使えない。ライブラリでグローバルに取られている変数があるから」って記載のある文献を目にしました。
.Netでは違うかもしれませんが・・・。
また、No.1の方の回答にあるように、Selectを使えば、送受信のデータ状況がわかるため、マルチスレッドにする必要はないです。というか、マルチスレッドにするとSelectが正常動作しないのでは?
補足ですが、socket関連の文献ってちょっと少なめで、しかもコードは「お勉強用」っていうものが多い気がします。まあ、勉強のコードに異常対応をきちんと入れたら、本筋が見えなくなる気もします。でも、socket関連の処理って異常処理が当たり前のように発生しますので、実用に耐えるレベルのコードは、「全てのエラーに完全対応する」っていうつもりで、状態遷移図を完成させてからコードを作成されるといいと思います。
返信ありがとうございます。
socketの文献って少ないですね・・・とくにwindowsソケットは。
もともと、UNIX?で開発されてきたから仕方ないのでしょうか・・
ありがとうございました。
No.3
- 回答日時:
コンソールアプリケーションならselectを使えば良いかと。
これならUNIXでも使える標準的な関数だしWinSockでも使えるでしょう。非同期もノンブロッキングもなしに通信の多重化ができます。Windowハンドルを要求するAPIをコンソールアプリケーションで使うのは適切とは考えられません。
返信ありがとうございます。
select関数を用いることで、送信スレッドおよび受信スレッドのマルチスレッド化をしなくても、シングルスレッドで送信受信が可能であるのですね。
参考にさせていただきます。
ありがとうございました。
No.1
- 回答日時:
>1.非同期やノンブロッキング関数はコンソール上で利用しなくてよいのでしょうか?
>2.ウィンドウを利用していないコンソールアプリでの記述方法はありますでしょうか?
WSAAsyncSelectを使う場合は必ずウインドウハンドルが必要です。
コンソールアプリであってもCreateWindow等を使って非表示のウインドウでも作れば不可能ではありませんが
メインループ及びWndProcが必要になります。WndProcがないとイベントを検知できませんから。
ただコンソールアプリの場合、別スレッドをたててWSAEventSelect等を使う方が普通だと思います。
>3.非同期のFD_WRITEとFD_READを使うことで、シングルスレッドで実現可能でしょうか?
可能です。というかWSAAsyncSelectを使う場合、別スレッドは不要です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Replace関数について教えて...
-
CSSが全く分かりません、お助け...
-
プログラミング 素数か素数では...
-
c言語の問題の説明、各所ごとに
-
DLLファイルの逆コンパイラにつ...
-
逆コンパイルと逆アセンブルの...
-
C言語について。
-
C#でログファイルにファイルパ...
-
終端記号、非終端記号とは
-
VisualStudioでC++クラスを追加...
-
int16_t の _t は何?
-
Cのオブジェクトファイルの逆ア...
-
C言語の関数のextern宣言
-
DNCL(共テ用プログラミング言語...
-
C#でTreeViewのCheckBoxのサイ...
-
CPUが16bitでも32bitOSでコンパ...
-
C言語 列挙型(enum型)変数について
-
コマンドプロンプトについて。
-
visual studioでフォームデザイ...
-
Windows Formアプリからコンソ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
非同期通信を使うタイミングが...
-
コールバック関数
-
OVERLAPPED構造体が分かりませ...
-
非同期式3進カウンタ
-
AJAX通信が終わるまで次の処理...
-
ajaxの使いどころ
-
非同期関数とノンブロッキング...
-
ExcelVBAで非同期のsocket通信...
-
SRAM製品の同期・非同期の違い
-
サーブレットはサーバーと同期...
-
JK-FFを使う非同期10進・2進カ...
-
非道式6進カウンタと非同期式10...
-
8ビットダウンカウンタをVerilo...
-
jsonテキストデータの並び替え...
-
ジャンクの箇所を一切書かずに...
-
【JavaScript】confirmのボタン...
-
saved from url=(0013)abou
-
HTMLでDBからデータを表形式で...
-
データ受け渡しについて
-
DirectXとOpenGLはどちらが動作...
おすすめ情報