掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Winsockを使った非同期的なsend() (ID:53233)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
返答ありがとうございます。 send()関数について思い違いをしていたようでお恥ずかしい限りです。 九条さんの返事を受けてFD_WRITEメッセージ取得時に下記のコードで対処したいと思います。 static char buf[1024] = "適当なデータ"; static int size = strlen(buf), wdsiz; do{ int ret; if((ret = send(socket, &buf[wdsiz], size, 0)) == SOCKET_ERROR){ if(WSAGetLastError() != WSAEWOULDBLOCK){ //エラーメッセージの表示 return; } } wdsiz += ret; size -= ret; }while(size); buf、size、wdsizの変数はグローバルなものです。 このコードではsend()関数がSOCKET_ERRORを返した場合すぐにリターンして、次のFD_WRITEが飛んでくるのを待ちますが、成功時にはbufの内容を全て送信しようとループします。 今まで見たサイトでは概ね「非同期ソケットにおいて Winsock は、 send()呼出し失敗後に再び書き込みができるようになった時に FD_WRITE メッセージを送ります。」などとエラー時の事は書いてあるのですが、正常終了時の事は書いてありません。 また、サイトに載っているソースを見るとsend()関数がバッファの全てを送信出来なかった場合について、あまり配慮されてないように思えます。 そこで上記のコードについて質問なのですが、send()関数が正常に終了した場合でも、次のFD_WRITEを待たなければいけないのでしょうか? それとも、上記のように成功する限りループしてもいいのでしょうか? 初歩的な問題を連発するようで申し訳ありませんが、どうぞよろしくお願いします。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.