プロが教えるわが家の防犯対策術!

お世話になります。
WinSockを用いてUDPパケット受信プログラムを作成しています。
環境はVC++です。ダイアログベースで、
STARTボタンを押すと受信開始します。


送信側よりパケットを1000個送信した場合、受信側では、

int num;
SOCKET sock;
char buf[1500];
//ソケットの設定は省略
while(1){
num = recvfrom(sock, buf, sizeof(buf), 0, NULL, NULL);
 printf("%d",num );
if( num == SOCKET_ERROR){
break;
}
}


recvfrom()で受信していますが、送信側で送信が完了しても
while()を抜けないのか、応答なし(フリーズ)してしまいます。
printf()で表示してみると、
ちゃんと送信パケット個数回表示されています。

送信パケット数は変動するため、受信側のプログラムには
個数がわかりませんため、while()でループしています。

while()を抜ける条件はどうしたらいいのでしょうか?
ちなみにrecvfrom()の戻り値として
SOCKET_ERROR,0を指定してもエラーになります。

長くなりましたが、どうぞよろしくお願い致します。

A 回答 (1件)

UDPはコネクションレスなので、送信側が終了してもそれを受信側で認識する手段はない。


従ってアプリケーションレベルで終了パケットを定義して、そのパケットが来たら終わりと決めておかない限り受信側で終了を確認できない。
あるいは、送信側が一定時間内に送ると決めておいて、受信側はその時間を十分に超えたらタイムアウトで終了するとか。

何にせよUDPを使う場合は送ったパケットが届かなかった場合も含めてちゃんとプロトコルを考えておかないとまともに動くものを作るのは難しいよ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
送信側の終了パケットで検討してみます。
大変わかりやすく、考え方わかりました。
本当にありがとうございました。

お礼日時:2007/03/09 09:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!