通信プログラムでの文字列送受信 – プログラミング – Home

通信プログラムでの文字列送受信
 
通知
すべてクリア

[解決済] 通信プログラムでの文字列送受信


ひぃ
 ひぃ
(@ひぃ)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

今、VS.NETのMFCを使用して通信プログラムを作成しています。
そこで質問なのですが、
送信側が20000バイト分の文字を送信したとき、受信側が8760バイトor4380バイトしか受
信してくれないという意味不明な現象が起きています。

原因がわかる方、ご教授お願い致します。

なお、うまく説明できないので、質問の意味がわからなければソースを載せます。

環境:
WinXP
VS.NET2003
MFC
SDI
MFCのCSocketを派生させた自作クラスを使用しています。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

質問の意味がわかろうがわかるまいが、
ソースを呈示せんことには
「なんかヘマやってんじゃないの?」
としか言えません。


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

> 送信側が20000バイト分の文字を送信したとき、受信側が8760バイトor
> 4380バイトしか受信してくれないという意味不明な現象が起きています。

まったく意味不明ではありません。
ソケットを使っているのなら、ごく普通に起こりうる現象です。
受信側でつなげてやるしかありません。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

一気に送ったものは丸ごと一度に受け取れると思い込んでいるのかな?


返信引用
aetos
(@aetos)
Noble Member
結合: 6年前
投稿: 1480
 

何回 recv しても、「トータルで」受信側が8760バイトor4380バイトしか受
信してくれないのだとしたら、確かに意味不明ですね。
だとすると、

>「なんかヘマやってんじゃないの?」
> としか言えません。


返信引用
ひぃ
 ひぃ
(@ひぃ)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

これはすいませんでした。
では、以下にソースを記入します。

送信側

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;
}

ちょっと簡単に書きましたが、このように記述しています。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

# ここまでのやり取りを読んでないな…

> if( pSock.Receive( szRecvMsg, 20000 ) == SOCKET_ERROR ) {
> return FALSE;
> }

要するに、
> 一気に送ったものは丸ごと一度に受け取れると思い込んでいるのかな?

…ですか?


返信引用
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 21年前
投稿: 122
 

すでにみなさんが回答されていますが、
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


返信引用
ひぃ
 ひぃ
(@ひぃ)
ゲスト
結合: 20年前
投稿: 8
Topic starter  

ちょっと急いでいたものであまり良い返答ができなくて申し訳ございませんでした。

> 一気に送ったものは丸ごと一度に受け取れると思い込んでいるのかな?
に関しては、
大きいサイズの場合は、一回のsendの内部で、分割されて送信されるというのを調べた
ことがあったので、それに合わせてrecvも分割されたデータを一回で受信できると思い
込んでいました。

実際、いろいろ値を見たり、KING・王さんの教えてくださったリンク先の文章を読
んだりして、何とか解決しました。

最終的に、ここの過去ログに書いてあった、「最初にサイズを送信し、受信サイズを決
める」という方法を使用してできました。

επιστημηさん、シャノンさん、KING・王さん、今までのご教授ありがとうございま
した。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました