![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
MFC VC++6.0で、ソケット通信を勉強しています。
サーバー側を
http://athomejp.com/goldfish/mfc/socket/socketse …
を参考に「ソケットから何かを受信する」ところの
配列サイズとwhileの条件を
char szBuf[1024];
while( nret != 0 )
に変更しました。
クライアントからは64バイトの送信をしているのですが、
サーバでReceiveしたサイズが16バイトで、whileを抜けてしまいます。
何が原因でしょうか、ご教示ください。
お願いいたします。
No.3ベストアンサー
- 回答日時:
>サーバでReceiveしたサイズが16バイトで、whileを抜けてしまいます。
>何が原因でしょうか、ご教示ください。
質問ページの下の方に
------------------------
また、一回のSendやReceiveでは、データが送受信できるとは限らないため、ソケットの送受信は、必ず、戻り値をチェックすること。
------------------------
と書いてあります。
ちょっと判りにくいですが、これは
------------------------
また、一回のSendやReceiveでは、すべてのデータが1回で送受信できるとは限らないため、ソケットの送受信は、必ず、戻り値をチェックすること。
また、送信した直後、送信バッファが一杯だと、2回目以降の送信バイト数が0になる事がある。
同様に、受信した直後、受信バッファにまだ続きのデータが何も溜まってないと、2回目以降の受信バイト数が0になる事がある。
------------------------
と言う意味です。
また、受信の場合「運が悪いと、ソケットが繋がった直後の最初の受信で、受信バッファがまだ空っぽで、0バイトしか読まない」なんて事も起きます。
質問者さんの場合では、送り側で64バイト送信しても、受け側で「何か来た!受け取れ!」と思って受け取っても「まだ64バイト全部来てなくて、頭の16バイトしか受け取れず、続きを受け取ろうと2回目の受信をしてみたらまだ続きが全然来てなくて何も受け取れず、nretが0になってループを抜けちゃった」って事が起きた訳です。
送信側で64バイト送っても、受信側は
・1回目で16バイト受け取る
・2回目で0バイト受け取る
・3回目で0バイト受け取る
・4回目で8バイト受け取る
・5回目で0バイト受け取る
・6回目で0バイト受け取る
・7回目で8バイト受け取る
・8回目で0バイト受け取る
・9回目で0バイト受け取る
(以下略)
って事が起きちゃう訳です。
ループ条件を
while( nret != 0 )
にしてしまうと、2回目の「続きがまだ全然来てなくて0バイト読んだ」って状態でループを抜けてしまうのです。
この問題は「CSocketが、ノンブロッキング、ブロッキング(ノンバッファリング、バッファリング)をかなり無茶な方法で実装している」のが原因で発生します。
No.2
- 回答日時:
CSocketは色々と問題があるみたいですね。
なんらかの原因でnretの値として0が返されている可能性があります。
while( nLen != sizeof( szBuf))
の場合は
nLen += nret;
でnLenがクライアント側の送出データサイズに到達するまではループから抜けることができないので、すべてのデータが受信できているのでしょう。
No.1
- 回答日時:
>char szBuf[1024];
>while( nret != 0 )
>に変更しました。
>クライアントからは64バイトの送信をしているのですが、
>サーバでReceiveしたサイズが16バイトで、whileを抜けてしまいます。
>何が原因でしょうか、ご教示ください。
当然、nretが0ではないからループから抜けたのでしょう。
送信側のsend()で1024バイトを1度で送信しても、受信側のreceive()1回で1024バイト受信できるとは限りません。
16バイト受信した後で、再度receive()を実行すると残りの48バイトが一度でとれるかも知れません。
# 勿論、そんな保証はないので16バイトずつ繰り返しになるかも知れませんし、もっと分断して受信するかも知れません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Outlook(アウトルック) Outlook 受信メールの文字サイズ変更 2 2022/10/14 14:41
- 面接・履歴書・職務経歴書 バイトに応募して、履歴書をメールで送ってくださいと言われメールで送ったのですが、送信済みフォルダに送 4 2023/04/30 16:16
- PHP どうして送信されないのでしょうか? 1 2022/12/09 05:23
- その他(メールソフト・メールサービス) Thunderbirdのメール送信ができません 1 2022/10/28 16:54
- 電車・路線・地下鉄 ITパスポート試験問題 7 2023/01/25 09:51
- 国産車 スバル製サンバー(日本車)整備に必要なソケットのサイズ 3 2023/03/04 19:02
- Windows 8 メール送信、zipファイル PDFについて 回答お願いいたします。 Windows8 メールはサクラ 1 2022/05/12 17:49
- サーバー 接続・ログインはできているのにメールが送信できない 2 2022/06/27 15:03
- プリンタ・スキャナー ブラザー プリンターMFC-J4720N 2 2022/07/17 20:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
VB6で漢字の1バイト目か2バイト...
-
memcmp バイナリデータの比較方法
-
ソケット通信の受信サイズ
-
文字数の限界
-
Javaで日本語1文字のバイト数
-
char str[256]の256の意味は?
-
SQLで1バイト、2バイト混在...
-
GetWindowTextでアドレスバーか...
-
ワイド文字のバイト数が取得で...
-
UTF-8で5~6バイトになる文字コ...
-
日付時刻を4バイトに
-
sedコマンドで全ての2バイト文...
-
バイト列とバイナリ列の違いが...
-
ポインター引数の関数でコンパ...
-
ESC/Pのテキスト印字の制...
-
printfの%eで指数部分の桁数を...
-
Rstudioによるテキストマイニン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
「1TB」のHDDに日本語は何字入...
-
バイナリとBCDコード
-
ビットスワップとバイトスワッ...
-
ピクセル,dpiから容量(バイト...
-
バイト列とバイナリ列の違いが...
-
SQLで1バイト、2バイト混在...
-
【VB2005】テキストボックス内...
-
Javaで日本語1文字のバイト数
-
1KBが1024byteな理由
-
3バイト文字(UTF-8)をprintfで...
-
C++ Builderで文字列をバイトに...
-
文字コードの利点・欠点について
-
半角、全角の判別方法
-
機種依存文字をチェックしたい。
-
64bit対応
おすすめ情報