UDPデータ損失率

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
史上最悪のデスペナ
記事: 521
登録日時: 8年前

UDPデータ損失率

#1

投稿記事 by 史上最悪のデスペナ » 7年前

softya(ソフト屋)さんが薦めてくださったWiresharkがまだ使い方が分からないので、送ったデータがどういう挙動をしているかは分からないのですが

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

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#2

投稿記事 by softya(ソフト屋) » 7年前

WAN越しの損失率は計測したことが無いですがLAN内で同一PC内にしては失敗しすぎな気がします。成功するまでの回数ですよね?
元のプログラムに成功までの計測機能がないようですがどうやって計測したのでしょうか?プログラム自体や計測方法の問題である可能性も十分にあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#3

投稿記事 by 史上最悪のデスペナ » 7年前

受信側を起動しておいて
成功するまでexeを手動で起動してカウントしました^^;

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#4

投稿記事 by softya(ソフト屋) » 7年前

当方では100%届きます。
ファイアウォールとかなにか邪魔してませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#5

投稿記事 by 史上最悪のデスペナ » 7年前

スタンドアロンにしてセキュリティソフトを終了させても変わりません

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#6

投稿記事 by softya(ソフト屋) » 7年前

そのUDPポートが既に使われているのかも知れません。
送受信のUDPポート番号を変えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#7

投稿記事 by 史上最悪のデスペナ » 7年前

自由に使っていいポート番号をいくつか使用してみましたが
多少になった程度ですね・・・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#8

投稿記事 by softya(ソフト屋) » 7年前

と言うことであればwireSharkでパケットをキャプチャしてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#9

投稿記事 by 史上最悪のデスペナ » 7年前

ネットで使い方いろいろ見てるんですが良く分からないです・・・・・・
分かるまでお待ちいただけますか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#10

投稿記事 by softya(ソフト屋) » 7年前

史上最悪のデスペナ さんが書きました:ネットで使い方いろいろ見てるんですが良く分からないです・・・・・・
分かるまでお待ちいただけますか?
私も書いていて不安になりました。
127.0.0.1のパケットってキャプチャ出来たっけ?
こちらでも調べてみます。こっちも時間がかかるのでお待ちください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#11

投稿記事 by 史上最悪のデスペナ » 7年前

お手数をおかけします。
よろしくお願いします

アバター
shiro4ao
記事: 224
登録日時: 9年前
住所: 広島

Re: UDPデータ損失率

#12

投稿記事 by shiro4ao » 7年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#13

投稿記事 by softya(ソフト屋) » 7年前

ごまかす技を幾つか試して見ましたがwindows7は頑固ですね。今のところダメです。
VMwarePlayerとか使って仮想PCとの間ならやり取りテストできるかも知れませんがLinuxで受信ソフト組むことになるので手間を考えて保留中。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#14

投稿記事 by 史上最悪のデスペナ » 7年前

データ損失率と関係あるのか分かりませんが、
recvではなくrecvfromを使うと数十回レベルじゃ受信されないようです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#15

投稿記事 by softya(ソフト屋) » 7年前

史上最悪のデスペナ さんが書きました:データ損失率と関係あるのか分かりませんが、
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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#16

投稿記事 by 史上最悪のデスペナ » 7年前

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 
以下略

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#17

投稿記事 by softya(ソフト屋) » 7年前

と言うことはロストということよりもパケットが生成出来ていないということですね。
送信処理でエラーチェックをしていないので、WSAStartup()/socket()/sendto()など関数でエラーが起きていないかチェックしてみてください。
ゲーム公開を目指している以上エラー処理も重要ですからね。良い勉強と思ってやってみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#18

投稿記事 by 史上最悪のデスペナ » 7年前

ということは結構な頻度でパケット生成が出来てないことに・・・・・・・

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#19

投稿記事 by softya(ソフト屋) » 7年前

史上最悪のデスペナ さんが書きました:ということは結構な頻度でパケット生成が出来てないことに・・・・・・・

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

現在エラー処理作成中です
聞いたことが無いですが何らかのファイアウォールなどが中途半端に動作していないとパケットの送信成功とロストの割合が考えられないです。後はネットワークドライバの不良とか。
全て私は経験したことないレベルですね。ネットワーク系の仕事をした事が無いのでよく有る事なのか断言はできませんが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#20

投稿記事 by 史上最悪のデスペナ » 7年前

次のようにエラー処理を行ったところ、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;
}
あまり変わって無いようです

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#21

投稿記事 by softya(ソフト屋) » 7年前

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

[補足] エラー処理を丁寧に書く癖をつけておかないとバグの原因がつかめず苦労することになります。特に配布したプログラムでバグると配布先でしか起こらないバグだったりするので、エラー時の処理を埋め込んでおくことは重要ですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#22

投稿記事 by 史上最悪のデスペナ » 7年前

おそらくですが、理由が分かりました。
VC++のせいです。

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

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

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#23

投稿記事 by 史上最悪のデスペナ » 7年前

と上手く終わりませんでした。受信側もエラー確認を作り、新しく作成したプロジェクトに書いたのにもかかわらず
今度は全く受信されません!

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

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#24

投稿記事 by 史上最悪のデスペナ » 7年前

やはり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;
}
使わないソケット作成してあるのは、交互に送受信させようとしかけていたからです

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#25

投稿記事 by softya(ソフト屋) » 7年前

1.1.1.1の送信成功率を教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。


アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#27

投稿記事 by softya(ソフト屋) » 7年前

こちらでは最新コードでも100%受信されます。

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

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

このツール相手に送信と受信をそれぞれテストを行なって下さい。
こちらでは問題なく送受信されました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#28

投稿記事 by 史上最悪のデスペナ » 7年前

送信成功率・・・・・・・・25%(5回/20回)
受信成功率・・・・・・・・100%

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: UDPデータ損失率

#29

投稿記事 by softya(ソフト屋) » 7年前

史上最悪のデスペナ さんが書きました:送信成功率・・・・・・・・25%(5回/20回)
受信成功率・・・・・・・・100%

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

UDP/IPテストツール → 史上最悪のデスペナさんの受信プログラム が送信成功率? それとも逆ですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

史上最悪のデスペナ
記事: 521
登録日時: 8年前

Re: UDPデータ損失率

#30

投稿記事 by 史上最悪のデスペナ » 7年前

ごめんなさい。
送信:Myプログラム→ツール
受信:ツール→Myプログラム

です。

閉鎖

“C言語何でも質問掲示板” へ戻る