ページ 13

UDPデータ損失率

Posted: 2012年1月21日(土) 14:38
by 史上最悪のデスペナ
softya(ソフト屋)さんが薦めてくださったWiresharkがまだ使い方が分からないので、送ったデータがどういう挙動をしているかは分からないのですが

こちらのサンプルプログラムそのままを実行したところ
通信が成功するのに要した通信回数は

コード:

1回
7回
4回
15回
33回
3回
16回
50回
2回
というふうになりました。自分のPC内で行っていることなのにデータ損失率が異常に高いように思えるのですが
実際にはどれくらいの損失率になるものなんでしょう?

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 15:11
by softya(ソフト屋)
WAN越しの損失率は計測したことが無いですがLAN内で同一PC内にしては失敗しすぎな気がします。成功するまでの回数ですよね?
元のプログラムに成功までの計測機能がないようですがどうやって計測したのでしょうか?プログラム自体や計測方法の問題である可能性も十分にあります。

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 15:46
by 史上最悪のデスペナ
受信側を起動しておいて
成功するまでexeを手動で起動してカウントしました^^;

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 16:15
by softya(ソフト屋)
当方では100%届きます。
ファイアウォールとかなにか邪魔してませんか?

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 16:31
by 史上最悪のデスペナ
スタンドアロンにしてセキュリティソフトを終了させても変わりません

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 16:37
by softya(ソフト屋)
そのUDPポートが既に使われているのかも知れません。
送受信のUDPポート番号を変えてみてください。

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 22:05
by 史上最悪のデスペナ
自由に使っていいポート番号をいくつか使用してみましたが
多少になった程度ですね・・・・・

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 22:09
by softya(ソフト屋)
と言うことであればwireSharkでパケットをキャプチャしてみましょう。

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 22:13
by 史上最悪のデスペナ
ネットで使い方いろいろ見てるんですが良く分からないです・・・・・・
分かるまでお待ちいただけますか?

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 22:23
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:ネットで使い方いろいろ見てるんですが良く分からないです・・・・・・
分かるまでお待ちいただけますか?
私も書いていて不安になりました。
127.0.0.1のパケットってキャプチャ出来たっけ?
こちらでも調べてみます。こっちも時間がかかるのでお待ちください。

Re: UDPデータ損失率

Posted: 2012年1月21日(土) 22:52
by 史上最悪のデスペナ
お手数をおかけします。
よろしくお願いします

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 05:02
by shiro4ao
ループバックアドレスはNIC通らないので(デフォルトでは)キャプチャできなかったきがします
なにかうまい方法があればいいんですが・・・・
(短文ですみません。)

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 10:03
by softya(ソフト屋)
ごまかす技を幾つか試して見ましたがwindows7は頑固ですね。今のところダメです。
VMwarePlayerとか使って仮想PCとの間ならやり取りテストできるかも知れませんがLinuxで受信ソフト組むことになるので手間を考えて保留中。

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 15:05
by 史上最悪のデスペナ
データ損失率と関係あるのか分かりませんが、
recvではなくrecvfromを使うと数十回レベルじゃ受信されないようです。

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 15:22
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:データ損失率と関係あるのか分かりませんが、
recvではなくrecvfromを使うと数十回レベルじゃ受信されないようです。
とりあえずパケット送信を確認したいので宛先IPアドレス1.1.1.1に指定してUDPパケットを送信してみてください。
これをwireSharkでキャプチャします。
filterには
ip.dst == 1.1.1.1
を指定して余分なものを表示しないようにして下さい。
これで数回繰り返して、回数分のパケットが発生するか確認してみてください。

[追記]
ちなみに、こんなパケットがキャプチャされます。
0000 00 0d 0b 82 aa 8e 00 25 22 21 bb 25 08 00 45 00 .......%"!.%..E.
0010 00 21 44 a3 00 00 80 11 32 6e c0 a8 01 11 01 01 .!D.....2n......
0020 01 01 f1 81 34 0d 00 0d 32 f8 48 45 4c 4c 4f ....4...2.HELLO

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 16:04
by 史上最悪のデスペナ
20回中7回観測されました
毎回2行目と3行目が違うようです

コード:

1回目
0000  00 a0 b0 7a 60 83 68 a3  c4 2c ab b8 08 00 45 00   ...z`.h. .,....E.
0010  00 21 5e f2 00 00 80 11  19 14 c0 a8 00 1c 01 01   .!^..... ........
0020  01 01 d8 15 d9 03 00 0d  a8 62 48 45 4c 4c 4f      ........ .bHELLO 

2回目
0000  00 a0 b0 7a 60 83 68 a3  c4 2c ab b8 08 00 45 00   ...z`.h. .,....E.
0010  00 21 5f 34 00 00 80 11  18 d2 c0 a8 00 1c 01 01   .!_4.... ........
0020  01 01 d8 17 d9 03 00 0d  a8 60 48 45 4c 4c 4f      ........ .`HELLO 

3回目
0000  00 a0 b0 7a 60 83 68 a3  c4 2c ab b8 08 00 45 00   ...z`.h. .,....E.
0010  00 21 5f c4 00 00 80 11  18 42 c0 a8 00 1c 01 01   .!_..... .B......
0020  01 01 c4 a3 d9 03 00 0d  bb d4 48 45 4c 4c 4f      ........ ..HELLO 
以下略

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 16:28
by softya(ソフト屋)
と言うことはロストということよりもパケットが生成出来ていないということですね。
送信処理でエラーチェックをしていないので、WSAStartup()/socket()/sendto()など関数でエラーが起きていないかチェックしてみてください。
ゲーム公開を目指している以上エラー処理も重要ですからね。良い勉強と思ってやってみましょう。

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 16:33
by 史上最悪のデスペナ
ということは結構な頻度でパケット生成が出来てないことに・・・・・・・

そういうことはありえるものなのでしょうか?

現在エラー処理作成中です

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 16:41
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:ということは結構な頻度でパケット生成が出来てないことに・・・・・・・

そういうことはありえるものなのでしょうか?

現在エラー処理作成中です
聞いたことが無いですが何らかのファイアウォールなどが中途半端に動作していないとパケットの送信成功とロストの割合が考えられないです。後はネットワークドライバの不良とか。
全て私は経験したことないレベルですね。ネットワーク系の仕事をした事が無いのでよく有る事なのか断言はできませんが。

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 19:35
by 史上最悪のデスペナ
次のようにエラー処理を行ったところ、20回中9回という結果になりました

コード:

#include <winsock2.h>

int
main()
{
 WSAData wsaData;

	SOCKET sock;
	struct sockaddr_in addr;
	int StartUpFlag;

    //エラー処理
	while(1)
	{
		StartUpFlag = WSAStartup(MAKEWORD(2,0), &wsaData);
		sock = socket(AF_INET, SOCK_DGRAM, 0);
		if( (sock != INVALID_SOCKET) && (StartUpFlag==0) ) break;
	}

	addr.sin_family = AF_INET;
	addr.sin_port = htons(55555);
	addr.sin_addr.S_un.S_addr = inet_addr("1.1.1.1");

	sendto(sock, "HELLO", 5, 0, (struct sockaddr *)&addr, sizeof(addr));

	closesocket(sock);

	WSACleanup();

	return 0;
}
あまり変わって無いようです

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 20:05
by softya(ソフト屋)
今のコードだとエラーリトライしていることが確認できませんのでエラーを表示したほうが良いと思います。
それとWSAStartup()で成功してもsocket()でエラーだとWSAStartup()をもう一度やるのもマズイと思います。
あとsendto()もエラーチェックできませんか? SOCKET_ERRORとか送信バイト数と食い違うことで確認できると思います。

[補足] エラー処理を丁寧に書く癖をつけておかないとバグの原因がつかめず苦労することになります。特に配布したプログラムでバグると配布先でしか起こらないバグだったりするので、エラー時の処理を埋め込んでおくことは重要ですよ。

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 20:19
by 史上最悪のデスペナ
おそらくですが、理由が分かりました。
VC++のせいです。

すべての箇所にエラー確認を埋め込んで実行してもエラーが起きないのにWireSharkにも反応が無いからおかしいと何度もやっていたら
とうとうビルドしたらソースが参照できませんとか出てきまして
再度最初からプロジェクトを作り直したところ、上手くいきました。

本当にお騒がせしました。

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 20:49
by 史上最悪のデスペナ
と上手く終わりませんでした。受信側もエラー確認を作り、新しく作成したプロジェクトに書いたのにもかかわらず
今度は全く受信されません!

やはりデバッグモードでやると
利用可能ソースがありません
だそうです。
VC++を入れなおしてみます

Re: UDPデータ損失率

Posted: 2012年1月22日(日) 22:42
by 史上最悪のデスペナ
やはり20回中10回ほどしか受信できていないようです・・・・・・・・・・・・・・・・・・・・・・
送信側コード

コード:

#include <stdio.h>
#include <winsock2.h>

int main()
{
	WSAData wsaData;

	SOCKET SendSock, RecvSock;
	struct sockaddr_in ServerAddr;

	int InitFlag, BindFlag, SendFlag;

	while(1)
	{
		InitFlag = WSAStartup(MAKEWORD(2,0), &wsaData);
		if( InitFlag==0 ) break;
		printf( "スタートアップエラー" );
	}

	while(1)
	{
		SendSock = socket(AF_INET, SOCK_DGRAM, 0);
		if( SendSock != INVALID_SOCKET ) break;
		printf( "ソケット作成エラー" );
	}
	while(1)
	{
		RecvSock = socket(AF_INET, SOCK_DGRAM, 0);
		if( RecvSock != INVALID_SOCKET ) break;
		printf( "ソケット作成エラー" );
	}

	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(54345);
	ServerAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	while(1)
	{
		SendFlag = sendto( SendSock, "HELLO", 5, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
		if( SendFlag == 5 ) break;
	}

	closesocket( SendSock );
	closesocket( RecvSock );

	WSACleanup();

	return 0;
}
受信側コード

コード:

#include <stdio.h>
#include <winsock2.h>

int main()
{
	WSAData wsaData;

	SOCKET RecvSock, SendSock;
	struct sockaddr_in addr, SendAddr;

	char buf[2048];

	int InitFlag, BindFlag;

	while(1)
	{
		InitFlag = WSAStartup(MAKEWORD(2,0), &wsaData);
		if( InitFlag==0 ) break;
		printf( "スタートアップエラー" );
	}

	while(1)
	{
		RecvSock = socket(AF_INET, SOCK_DGRAM, 0);
		if( RecvSock != INVALID_SOCKET ) break;
		printf( "受信ソケット作成エラー" );
	}
	while(1)
	{
		SendSock = socket(AF_INET, SOCK_DGRAM, 0);
		if( SendSock != INVALID_SOCKET ) break;
		printf( "送信ソケット作成エラー" );
	}

	addr.sin_family = AF_INET;
	addr.sin_port = htons(54345);
	addr.sin_addr.S_un.S_addr = INADDR_ANY;

	while(1)
	{
		BindFlag = bind( RecvSock, (struct sockaddr *)&addr, sizeof(addr) );
		if( BindFlag == 0 ) break;
		printf( "バインドエラー" );
	}

	int Size = sizeof( SendAddr );

	while(1)
	{
		memset( buf, 0, sizeof(buf));
		recvfrom( RecvSock, buf, sizeof(buf), 0, (struct sockaddr *)&SendAddr, &Size );

		printf("%s\n", buf);
	}

	closesocket( RecvSock );
	closesocket( SendSock );

	WSACleanup();

	return 0;
}
使わないソケット作成してあるのは、交互に送受信させようとしかけていたからです

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 01:00
by softya(ソフト屋)
1.1.1.1の送信成功率を教えて下さい。

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 08:04
by 史上最悪のデスペナ
100%でした

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 09:30
by softya(ソフト屋)
こちらでは最新コードでも100%受信されます。

他の人の作ったツールでテストしてみてください。

「UDP/IPテストツールの詳細情報 : Vector ソフトを探す!」
http://www.vector.co.jp/soft/winnt/net/se478370.html

このツール相手に送信と受信をそれぞれテストを行なって下さい。
こちらでは問題なく送受信されました。

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 16:26
by 史上最悪のデスペナ
送信成功率・・・・・・・・25%(5回/20回)
受信成功率・・・・・・・・100%

でした。IPアドレスが127.0.0.1なのでWireSharkでは確認できませんでした

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 16:29
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:送信成功率・・・・・・・・25%(5回/20回)
受信成功率・・・・・・・・100%

でした。IPアドレスが127.0.0.1なのでWireSharkでは確認できませんでした
どちらからどちらでしょうか?

UDP/IPテストツール → 史上最悪のデスペナさんの受信プログラム が送信成功率? それとも逆ですか?

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 16:39
by 史上最悪のデスペナ
ごめんなさい。
送信:Myプログラム→ツール
受信:ツール→Myプログラム

です。