
こんばんわ。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- その他(メールソフト・メールサービス) メールサーバーは「PC側がメールをDL済みか否か?」を何を以て感知するのか? 2 2022/12/20 14:56
- Gmail gmailで独自ドメインアドレスのメールが届かない件 1 2023/08/25 23:24
- 所得税 電子税?のメールについて教えてください 8 2022/09/04 21:38
- LINE ラインの疑似体験(?)が出来るサービスは? 3 2023/03/26 19:52
- その他(IT・Webサービス) [PayPay銀行キャッシュカード拾得の件] このメールは本物か? 6 2022/09/15 21:52
- UNIX・Linux redmineにメールを飛ばす方法 1 2022/09/13 22:02
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- 格安スマホ・SIMフリースマホ IIJmio スマホ大特価セール 1,980円 19,819円 クレジットカードで申請された 1 2022/10/10 05:20
- 固定電話・IP電話・FAX 業務用ファックスについて 5 2022/09/28 19:08
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VistaガジェットでGmailのメー...
-
【JavaScript】confirmのボタン...
-
DelphiでSelectDirectoryを..
-
HTMLでDBからデータを表形式で...
-
読み取り専用が外れない
-
ローカルネットワーク内での502...
-
掲示板の作り方
-
ファイルアップロード前にファ...
-
Ajaxでデータベース更新
-
iframeでhatenaを読み込むとペ...
-
sleepの負荷
-
Python3, Flask, Jinja2などで...
-
[JavaScript] preven...
-
jQueryでGETだと送信できるデー...
-
呼び出し元のURLを知りたいのです
-
jsonテキストデータの並び替え...
-
cakePHP+Ajax アップロード状...
-
webシステムでchrome
-
ブラウザ(IE)からEXEファイル...
-
HTMLファイルにテキストファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
8ビットダウンカウンタをVerilo...
-
AJAX通信が終わるまで次の処理...
-
非同期関数とノンブロッキング...
-
AJAX通信で、ボタンをクリック...
-
wininet.dllのInternetOpenの同...
-
Javadcriptでwebサーバー側にあ...
-
各種APIを使ってwebサービスを...
-
OVERLAPPED構造体が分かりませ...
-
JK-FFを使う非同期10進・2進カ...
-
SRAM製品の同期・非同期の違い
-
AJAX通信のエラー処理について
-
phpとajaxの比較
-
C#でUDP通信
-
Ajax非同期通信の多重リクエス...
-
CPU I/Oポート 通信 モニタ
-
サイトのデータ(HTML)を取得
-
非同期接続について質問です
-
ExcelVBAで非同期のsocket通信...
-
AJAXとSEO。同期通信とPHP送信...
-
RS-232Cの通信方式に関して。
おすすめ情報