今、VS.NETのMFCを使用して通信プログラムを作成しています。
そこで質問なのですが、
送信側が20000バイト分の文字を送信したとき、受信側が8760バイトor4380バイトしか受
信してくれないという意味不明な現象が起きています。
原因がわかる方、ご教授お願い致します。
なお、うまく説明できないので、質問の意味がわからなければソースを載せます。
環境:
WinXP
VS.NET2003
MFC
SDI
MFCのCSocketを派生させた自作クラスを使用しています。
質問の意味がわかろうがわかるまいが、
ソースを呈示せんことには
「なんかヘマやってんじゃないの?」
としか言えません。
> 送信側が20000バイト分の文字を送信したとき、受信側が8760バイトor
> 4380バイトしか受信してくれないという意味不明な現象が起きています。
まったく意味不明ではありません。
ソケットを使っているのなら、ごく普通に起こりうる現象です。
受信側でつなげてやるしかありません。
一気に送ったものは丸ごと一度に受け取れると思い込んでいるのかな?
何回 recv しても、「トータルで」受信側が8760バイトor4380バイトしか受
信してくれないのだとしたら、確かに意味不明ですね。
だとすると、
>「なんかヘマやってんじゃないの?」
> としか言えません。
これはすいませんでした。
では、以下にソースを記入します。
送信側
char* szSendMsg;
szSendMsg = (char*)calloc(20001, sizeof(char) );
for(int i=0; i<20000; i++ ) { strcat(szSendMsg, A); }
if( pSock.Send( szSendMsg, strlen(szSendMsg) ) == SOCKET_ERROR ) {
return FALSE;
}
受信側
char* szRecvMsg;
szRecvMsg = (char*)calloc(20001, sizeof(char) );
if( pSock.Receive( szRecvMsg, 20000 ) == SOCKET_ERROR ) {
return FALSE;
}
ちょっと簡単に書きましたが、このように記述しています。
# ここまでのやり取りを読んでないな…
> if( pSock.Receive( szRecvMsg, 20000 ) == SOCKET_ERROR ) {
> return FALSE;
> }
要するに、
> 一気に送ったものは丸ごと一度に受け取れると思い込んでいるのかな?
…ですか?
すでにみなさんが回答されていますが、
TCP/IPなどを用いた通信関数では、仮に1度に2000byteのデータをsend()等で送信し、
受信側でrecv()等で2000byteの受信を試みても、最初の1000byteしか受信できないようなこと
があります。
その場合、再度受信側でrecv()などで残りのデータサイズの受信をこころ見る必要がありま
す。
この1回で送信できるデータ量は、ネットワークのトラフィックなどに影響されますので、
何byteまでなら、確実に1回でrecv()できるというようなことはありません。
SDKのrecv()なら戻り値の値で、実際に受信したデータ量が分かります。
他のサイトですが、下記で、同様の内容が議論されていたと思いますので参考にして下さい。
> http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200508/05080004.txt
ちょっと急いでいたものであまり良い返答ができなくて申し訳ございませんでした。
> 一気に送ったものは丸ごと一度に受け取れると思い込んでいるのかな?
に関しては、
大きいサイズの場合は、一回のsendの内部で、分割されて送信されるというのを調べた
ことがあったので、それに合わせてrecvも分割されたデータを一回で受信できると思い
込んでいました。
実際、いろいろ値を見たり、KING・王さんの教えてくださったリンク先の文章を読
んだりして、何とか解決しました。
最終的に、ここの過去ログに書いてあった、「最初にサイズを送信し、受信サイズを決
める」という方法を使用してできました。
επιστημηさん、シャノンさん、KING・王さん、今までのご教授ありがとうございま
した。