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プログラム

です。

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

Re: UDPデータ損失率

#31

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

と言うことは史上最悪のデスペナさんの送信側プログラムに何らかの問題があると考えるのが妥当かと思います。
ところでWinscok2はws2_32.libを使われていますよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: UDPデータ損失率

#32

投稿記事 by YuO » 7年前

ひとつ思ったのですが,「送信エラー」等の出力時に,WSAGetLastError APIの値は確認していますか。
WSAStartupでも確認せずにループをしているあたり,エラー処理が全然なされていないのではないか,という気がしますが。
# WSAStartupの失敗は致命的なエラー扱いでいいと思う……。

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

Re: UDPデータ損失率

#33

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

最初にWinsockについて調べたときにここ
WinSockを使うにはちょっとクセがあって、[wsock32.lib]というライブラリーにリンクせねばなりません。
と書いてあったのでそれをリンクしてました。それ以降、他のサイトではその部分を流していたので・・・・・
ws2_32.libに書き換えましたが、
25%→45%(9回/20回)になっただけでした

値は全く確認してませんね、確かに。それを入れてきます


追記
以降、特に明記しない限り
    送信:私の送信プログラムが送信すること
    受信:私の受信プログラムが受信すること
とします

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

Re: UDPデータ損失率

#34

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

ws2_32.libはWinSock2.h用でwsock32.libはWinSock.h用です。バージョンが違うので注意して下さい。
それと連続5回通信とかの機能を入れてみてください。送信文字列はHELLO0~HELLO4と変化するのが望ましいです。
これは、一回の送信毎に確率的に失敗するのか、何らかの初期化周りが成功すれば連続送信が成功するのか知りたいためです。

[追記]史上最悪のデスペナさんがリリースビルドしたプログラムを添付してもらって良いですか?
ソースレベルではなくexeレベルでチェックしたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#35

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

softya(ソフト屋) さんが書きました:[追記]史上最悪のデスペナさんがリリースビルドしたプログラムを添付してもらって良いですか?
ソースレベルではなくexeレベルでチェックしたいです。
ごめんなさい、これのやり方がわかりません。教えてください

合ってるかはわかりませんが、DebugモードではなくReleaseモードでビルドしたときに以下のエラーが出ました

1>------ ビルド開始: プロジェクト: 01, 構成: Release Win32 ------
1>01.obj : error LNK2001: 外部シンボル "__imp__closesocket@4" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__socket@12" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__WSACleanup@0" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__sendto@24" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__htons@4" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__inet_addr@4" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__WSAStartup@8" は未解決です。
1>C:\Users\TO\Desktop\WinSock\05.UDP-1(単純) - コピー\Client\Release\01.exe : fatal error LNK1120: 外部参照 7 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
最後に編集したユーザー 史上最悪のデスペナ on 2012年1月23日(月) 18:18 [ 編集 1 回目 ]

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

Re: UDPデータ損失率

#36

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

送信プログラムをリリースビルドして出来上がったexeをZIP圧縮して、ここに添付してもらうだけで良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#37

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

史上最悪のデスペナ さんが書きました:合ってるかはわかりませんが、DebugモードではなくReleaseモードでビルドしたときに以下のエラーが出ました

1>------ ビルド開始: プロジェクト: 01, 構成: Release Win32 ------
1>01.obj : error LNK2001: 外部シンボル "__imp__closesocket@4" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__socket@12" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__WSACleanup@0" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__sendto@24" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__htons@4" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__inet_addr@4" は未解決です。
1>01.obj : error LNK2001: 外部シンボル "__imp__WSAStartup@8" は未解決です。
1>C:\Users\TO\Desktop\WinSock\05.UDP-1(単純) - コピー\Client\Release\01.exe : fatal error LNK1120: 外部参照 7 が未解決です。
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========
編集が遅かったのでお返事を既に頂いていたようですね。
普段はDebugモードを使用しているのですが、Debugモードではエラーが出なかったのにReleaseモードでは以上のようなエラーが出てビルドできませんでした

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

Re: UDPデータ損失率

#38

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

ライブラリの指定はDebugとReleaseで別に行う必要があります。

環境依存な方法としては
#pragma comment(lib,"ws2_32.lib")
とソースプログラム中に書いてしまう方法もあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#39

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

よろしくお願いします
01.zip
(3.37 KiB) ダウンロード数: 28 回

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

Re: UDPデータ損失率

#40

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

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

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

Re: UDPデータ損失率

#41

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

例のツールのポート番号が4000だったのでそれにあわせたままです

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

Re: UDPデータ損失率

#42

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

試した所100%届きました。
と言うことは史上最悪のデスペナさんのOS、ファイアウォール、ウィルス対策ソフト,winsock2のdllあたりが怪しいと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#43

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

OSに関してはどうしようもないのですが・・・・・・
ファイアウォールとウィルス対策ソフトは切ったりしてやってみます。
dllはどっかから落としてくるのですかね?

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

Re: UDPデータ損失率

#44

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

softya(ソフト屋) さんが書きました:それと連続5回通信とかの機能を入れてみてください。送信文字列はHELLO0~HELLO4と変化するのが望ましいです。
これは、一回の送信毎に確率的に失敗するのか、何らかの初期化周りが成功すれば連続送信が成功するのか知りたいためです。
まだ、これ出来てませんがファイアウォールやセキュリティソフトを切ったときの送信テストは以下のようになりました

コード:

セキュリティソフト:なし  ファイアウォール:あり・・・・・・・・・・40%(8回/20回)
セキュリティソフト:あり  ファイアウォール:なし・・・・・・・・・・20%(4回/20回)
セキュリティソフト:なし  ファイアウォール:なし・・・・・・・・・・30%(6回/20回)

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

Re: UDPデータ損失率

#45

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

デバッカを介さず直接exeを起動しても同じぐらいの確率ですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#46

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

softya(ソフト屋) さんが書きました:デバッカを介さず直接exeを起動しても同じぐらいの確率ですか?
はい。そうです
史上最悪のデスペナ さんが書きました:

コード:

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

コード:

	sendto( SendSock, "HELLO-0", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-1", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-2", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-3", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-4", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
のように変えたところ、この塊が送信されるか、一個も送信されないかのどちらかでした。
今回の確率(セキュリティソフト・ファイアウォールあり)・・・・・・・55%(11回/20回)

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

Re: UDPデータ損失率

#47

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

既に聞いたことのない未知の領域ですので、こうなったら細かい所をチェックして行きましょう。

(1)windows updateを徹底的に行う。

(2)winsock2のバージョンを確認。
「WinSockの情報」
http://wisdom.sakura.ne.jp/system/winap ... Sock2.html

(3)WSAGetLastErrorなどでエラーをチェックしまくる。
closesocket()などもチェックして下さい。もしかしたらパケット送出に失敗した戻り値が戻るかも知れません。
リトライはしなくて良いですが、エラーの詳細を表示して終了して下さい。

これらで治らないならOSの再インストールなど大掛かりな作業をするしか無い気がしてきました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#48

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

(1)windows updateを徹底的に行う。→クリア

(2)winsock2のバージョンを確認。→

コード:

printf("バージョン = %d.%d\n記述 = %s\n状態 = %s\n" ,
		(BYTE)wsaData.wHighVersion , wsaData.wHighVersion >> 8 ,
		wsaData.szDescription ,	wsaData.szSystemStatus
	);
より2.2と表示された

(3)WSAGetLastErrorなどでエラーをチェックしまくる。→
意味不明な挙動

コード:

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

int main()
{
	WSAData wsaData;

	SOCKET SendSock, RecvSock;
	struct sockaddr_in ServerAddr;

	int Flag;

	WSAStartup(MAKEWORD(2,0), &wsaData);
	Flag = WSAGetLastError();
	printf("%d",Flag);
	SendSock = socket(AF_INET, SOCK_DGRAM, 0);
	printf("%d",Flag);

	RecvSock = socket(AF_INET, SOCK_DGRAM, 0);
	printf("%d",Flag);

	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(4000);
	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;
	}
*/
	sendto( SendSock, "HELLO-0", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-1", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-2", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-3", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-4", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	printf("%d",Flag);

	closesocket( SendSock );
	closesocket( RecvSock );
	printf("%d",Flag);

	WSACleanup();
	printf("%d",Flag);

	return 0;
}
だと、すべて0なのに送れなかったり、送れてもHello0だけだったり。

コード:

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

int main()
{
	WSAData wsaData;

	SOCKET SendSock, RecvSock;
	struct sockaddr_in ServerAddr;

	int Flag;

	WSAStartup(MAKEWORD(2,0), &wsaData);
	Flag = WSAGetLastError();
	printf("%d\n",Flag);
	SendSock = socket(AF_INET, SOCK_DGRAM, 0);
	Flag = WSAGetLastError();
	printf("%d\n",Flag);

	RecvSock = socket(AF_INET, SOCK_DGRAM, 0);
	Flag = WSAGetLastError();
	printf("%d\n",Flag);

	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(4000);
	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;
	}
*/
	sendto( SendSock, "HELLO-0", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	Flag = WSAGetLastError();
	printf("%d\n",Flag);
	sendto( SendSock, "HELLO-1", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	Flag = WSAGetLastError();
	printf("%d\n",Flag);
	sendto( SendSock, "HELLO-2", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	Flag = WSAGetLastError();
	printf("%d\n",Flag);
	sendto( SendSock, "HELLO-3", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	Flag = WSAGetLastError();
	printf("%d\n",Flag);
	sendto( SendSock, "HELLO-4", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	Flag = WSAGetLastError();
	printf("%d\n",Flag);

	closesocket( SendSock );
	closesocket( RecvSock );
	Flag = WSAGetLastError();
	printf("%d\n",Flag);

	WSACleanup();
	Flag = WSAGetLastError();
	printf("%d\n",Flag);

	return 0;
}
こうすると全て100%送信可。ただし、ブレイクポイントをreturn0に設定しておき、ブレイクポイントでの強制終了すると
次の数回は送れないか、またはHELLO0のみの送信となる

という結果になりました

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

Re: UDPデータ損失率

#49

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

WSAGetLastError()だけでなく全部の戻り値をチェックして下さい。

あとServerAddrの内容をクリアしたらどうなります?
memset(&ServerAddr, 0x00, siezof(ServerAddr));
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#50

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

softya(ソフト屋) さんが書きました:WSAGetLastError()だけでなく全部の戻り値をチェックして下さい。
WSAGetLastError()を無くして戻り値だけのチェック

コード:

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

int main()
{
	WSAData wsaData;

	SOCKET SendSock, RecvSock;
	struct sockaddr_in ServerAddr;

	int InitFlag, BindFlag, SendFlag;

	InitFlag = WSAStartup(MAKEWORD(2,0), &wsaData);
	switch(InitFlag)
	{
		case WSASYSNOTREADY:
			printf("ネットワークへの接続準備ができていない");
			break;
		case WSAVERNOTSUPPORTED:
			printf("要求した WinSock のバージョンはこのシステムで提供されていない");
			break;
		case WSAEINPROGRESS:
			printf("ブロッキング操作の実行中であるまたはサービスプロバイダがコールバック関数を処理している");
			break;
		case WSAEPROCLIM:
			printf("WinSock が同時に処理できる最大プロセスに達成した");
			break;
		case WSAEFAULT:
			printf("lpWSAData は有効なポインタではない");
			break;
	}
	SendSock = socket(AF_INET, SOCK_DGRAM, 0);
		if( SendSock == INVALID_SOCKET ) printf("送信ソケット作成エラー");
	RecvSock = socket(AF_INET, SOCK_DGRAM, 0);
		if( RecvSock == INVALID_SOCKET ) printf("受信ソケット作成エラー");

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

	int len = sendto( SendSock, "HELLO-0", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-1", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-2", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-3", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-4", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	if( len == SOCKET_ERROR ) printf("SOCKET_ERROR");
	if( len < 7 ) printf("Short");

	int Flag = closesocket( SendSock );
		if( Flag == SOCKET_ERROR ) printf("SendSock_CLOSE_ERROR");
	Flag = closesocket( RecvSock );
		if( Flag == SOCKET_ERROR ) printf("RecvSock_CLOSE_ERROR");

	WSACleanup();

	return 0;
}
何も表示されないのにもかかわらず成功率50%(3回/6回)

WSAGetLastError()と戻り値のチェック

コード:

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

int main()
{
	WSAData wsaData;

	SOCKET SendSock, RecvSock;
	struct sockaddr_in ServerAddr;

	int InitFlag, ErrorFlag;

	InitFlag = WSAStartup(MAKEWORD(2,0), &wsaData);
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		switch(InitFlag)
		{
			case WSASYSNOTREADY:
				printf("ネットワークへの接続準備ができていない");
				break;
			case WSAVERNOTSUPPORTED:
				printf("要求した WinSock のバージョンはこのシステムで提供されていない");
				break;
			case WSAEINPROGRESS:
				printf("ブロッキング操作の実行中であるまたはサービスプロバイダがコールバック関数を処理している");
				break;
			case WSAEPROCLIM:
				printf("WinSock が同時に処理できる最大プロセスに達成した");
				break;
			case WSAEFAULT:
				printf("lpWSAData は有効なポインタではない");
				break;

		}
	SendSock = socket(AF_INET, SOCK_DGRAM, 0);
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( SendSock == INVALID_SOCKET ) printf("送信ソケット作成エラー");
	RecvSock = socket(AF_INET, SOCK_DGRAM, 0);
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( RecvSock == INVALID_SOCKET ) printf("受信ソケット作成エラー");

	ServerAddr.sin_family = AF_INET;
	ServerAddr.sin_port = htons(4000);
	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;
	}
*/
	int len = sendto( SendSock, "HELLO-0", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-1", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-2", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-3", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
	sendto( SendSock, "HELLO-4", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( len == SOCKET_ERROR ) printf("SOCKET_ERROR");
		if( len < 7 ) printf("Short");


	int Flag = closesocket( SendSock );
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( Flag == SOCKET_ERROR ) printf("SendSock_CLOSE_ERROR");
	Flag = closesocket( RecvSock );
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( Flag == SOCKET_ERROR ) printf("RecvSock_CLOSE_ERROR");

	WSACleanup();
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);

	return 0;
}
Hello0のみかHello0~4全てのどちらかが必ず送信される

なので少しコードを変えて送信ごとにチェック

コード:

前略
	int len = sendto( SendSock, "HELLO-0", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( len == SOCKET_ERROR ) printf("SOCKET_ERROR");
		if( len < 7 ) printf("Short");
	len = sendto( SendSock, "HELLO-1", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( len == SOCKET_ERROR ) printf("SOCKET_ERROR");
		if( len < 7 ) printf("Short");
	len = sendto( SendSock, "HELLO-2", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( len == SOCKET_ERROR ) printf("SOCKET_ERROR");
		if( len < 7 ) printf("Short");
	len = sendto( SendSock, "HELLO-3", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( len == SOCKET_ERROR ) printf("SOCKET_ERROR");
		if( len < 7 ) printf("Short");
	len = sendto( SendSock, "HELLO-4", 7, 0, (struct sockaddr *)&ServerAddr, sizeof(ServerAddr) );
		ErrorFlag = WSAGetLastError();
		printf("%d\n",ErrorFlag);
		if( len == SOCKET_ERROR ) printf("SOCKET_ERROR");
		if( len < 7 ) printf("Short");
後略
毎回成功

このようになりました。
softya(ソフト屋) さんが書きました:あとServerAddrの内容をクリアしたらどうなります?
memset(&ServerAddr, 0x00, siezof(ServerAddr));
これはどこに入れたらいいんでしょう?

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

Re: UDPデータ損失率

#51

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

memset(&ServerAddr, 0x00, siezof(ServerAddr));は宣言の直後ですね。
なんか、今までの話を総合するとSleep(100)とか入れたら成功したりして。これまmemsetと別に実験して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#52

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

エラーチェック、戻りチェック一切なし&memset
→完全成功率40%(4回/10回)、不完全成功率(Hello0のみ)10%(1回/10回)

エラーチェック、戻りチェック一切なし&memset無し&全Winsock関数後Sleep(100)
→100%(5回/5回)

中略

エラーチェック、戻りチェック一切なし&memset無し&全てのsendto後のみSleep(100)・・・・・・・・・・・・・・・A
→100%(10回/10回)

エラーチェック、戻りチェック一切なし&memset無し&一部のsendto後のみSleep(100)
→その後にSleepしなかったsendtoは送信されないことあり。
追記:Hello0に限ってはそれのみ送信されることもある

中略

Aの送信成功最低Sleep時間:1(ms)

結論:sendtoの後ある程度の時間を置かないとバッファ(?)が上書きされるなどの状況が発生し、送信が行われなくなることがある。

でも、そうするとMMOとかリアルタイム性の強いものはどうしたらいいのでしょう?
調べてみて、usleepやnanosleepというものを知りましたが、
このサイトの通り.hをインクルードしても関数定義が無いとエラーが出て使えません
最後に編集したユーザー 史上最悪のデスペナ on 2012年1月24日(火) 22:33 [ 編集 1 回目 ]

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

Re: UDPデータ損失率

#53

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

この事実から、私が予想するのはsendto()からclosesocket()の間にSleepが必要なのではないか?って事なのですが実験してもらえますか?ほかはSleepを外して下さい。

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

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

Re: UDPデータ損失率

#54

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

softya(ソフト屋) さんが書きました:この事実から、私が予想するのはsendto()からclosesocket()の間にSleepが必要なのではないか?って事なのですが実験してもらえますか?ほかはSleepを外して下さい。
これも実験しました。
史上最悪のデスペナ さんが書きました:エラーチェック、戻りチェック一切なし&memset無し&一部のsendto後のみSleep(100)
→その後にSleepしなかったsendtoは送信されないことあり。
追記:Hello0に限ってはそれのみ送信されることもある
と同じ結果になりました。

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

Re: UDPデータ損失率

#55

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

うーん。万策尽きました。
史上最悪のデスペナさんの状態が一般的な問題なのか広く普通にある状態なのか分からないのですが、Sleep(はごまかしに過ぎませんので最終最悪の手段でしかありません。
たまたま、上手く行っているように見えるだけかも知れません。

マイクロソフトの公式なサンプルは、この形ですのでこの形で上手くいかないのならOSやDLLやレジストリなどに何らかの異常があると判断したほうがよさそうです。
「sendto function」
http://msdn.microsoft.com/en-us/library ... s.85).aspx
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: UDPデータ損失率

#56

投稿記事 by beatle » 7年前

的はずれな回答かもですが,同じ送信先にsendtoすると失敗する,みたいなことはないでしょうか.違う送信先なら連続でやっても成功するとか.
同じ送信先に連続でsendtoすることはあまり考慮されていないのかもって思ったんです.
同じ送信先に送るデータは一つの配列にまとめればいいだけの話ですからね.

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

Re: UDPデータ損失率

#57

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

beatleさんにもNo: 39 を試してもらいたいのですが、私の所では成功しますが史上最悪のデスペナさんの所では失敗する可能性のあるプログラムです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: UDPデータ損失率

#58

投稿記事 by beatle » 7年前

No.27
softya(ソフト屋) さんが書きました: 「UDP/IPテストツールの詳細情報 : Vector ソフトを探す!」
http://www.vector.co.jp/soft/winnt/net/se478370.html
とNo.39
史上最悪のデスペナ さんが書きました: よろしくお願いします
01.zip
を組み合わせて,01.exe -> UDP/IPテストツールのテストを試みました.
まずUDP/IPテストツールで,ポート番号などいじらず,「接続」ボタンを押して接続しました.
次に,01.exeをターミナル上で実行したところ,UDP/IPテストツールのログ表示部分に
「->受 127.0.0.1 (49702)HELLO」
と表示されました.
bashスクリプトを利用し,連続で10回01.exeを実行したところ,ポート番号(49702)がインクリメントされる以外は初回と同様に受信されました.
「10回送信」を何度繰り返しても,その都度10回"HELLO"を受信します.

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: UDPデータ損失率

#59

投稿記事 by beatle » 7年前

ちなみに私の環境は
Windows 7 Ultimate SP1 64bit
Intel Core i7 960 3.2GHz
6.0GB RAM
となっています.

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

Re: UDPデータ損失率

#60

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

ありがとうございます。
やはり環境問題なのかなって気がしてきました。

私は
Windows7 business sp1 64bit
AMD Athlon(tm) II X4 630 Processor 2.8GHz
メモリ 4GB
ウィルス対策ソフト:ウィルスバスター
ファイアウォール:Windowsファイアウォール
です。

【補足】他にもここを読んでいてテスト可能な方はテストをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
沖 滉均
記事: 237
登録日時: 9年前
住所: K県F市

Re: UDPデータ損失率

#61

投稿記事 by 沖 滉均 » 7年前

ちょっと試してみました
手順はbeatleさんと一緒

perlで01.exeを連続10回実行させてみましたが
こちらでもポート番号が初回受信時からインクリメントされる以外は初回と同様に受信できました。

[確認環境]
Windows XP Professional SP3 32bit
Intel Core2 Duo P8600 2.4GHz
メモリ 2GB
ウィルス対策ソフト:Symantec Endpoint Protection
There is no royal road to learning.
codeタグで指定できる言語
画像

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

Re: UDPデータ損失率

#62

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

みなさんありがとうございます。

私の環境は
Windows7 HomePremium SP1 64bit
IntelCorei5 2.66GHz
メモリ 4.00GB
ウィルス対策ソフト KingsoftAntivirus
ファイアウォール Windowsファイアウォール

です

現在レジストリ修復ツール・デフラグツールを使って精査中です
(まあ、精査中といってもプログラムを走らせてエラーがあったらエラー修復ボタンを押すだけなんですが)

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

Re: UDPデータ損失率

#63

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

ついでにXPでも試して見ました。

WindowsXP SP3 32bit
VMware Player
ウィルス対策ソフト:Avira Antivir Personal
ファイアウォール:Windowsファイアウォール

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

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

Re: UDPデータ損失率

#64

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

corei5が駄目・・・・・・なんでしょうか?

そういえばこんなサイト見つけました
513 回目までは正しく送信できているのですが、 514~1623 まではデータがサーバに届いていません。 その後も、89449~97804、97871~98469、98536~100000 は紛失し、結局届いたのは 100,000 分の 3,618。 到達率 3.6%、つまり
データ損失率 96.4%
というものすごいことになっています。
だそうです。

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

Re: UDPデータ損失率

#65

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

Core i5全般の問題では無く、ソフト側はOSやデバイスドライバの不具合、ハードはメモリ不良、お持ちのCore i5の不良などの可能性があります。
ただ、他にも問題が出そうなものですがUDPだけがやけに調子が悪いです。

この問題を切り分けるにはOSが一番怪しいので、OSを新規インストールするとか同じPCに別OSをインストールして試してみるとか根幹周りの動作確認が不可欠です。
ハード側はチェックツールを使います。

「CPUに意図的に負荷を掛けて不具合が無いかチェックするフリーソフト「Prime95」 | aquapple (archives)」
http://aquapple.jugem.jp/?eid=1071
「パソコン故障を無料ツール「 Ultimate Boot CD 」で検査する」
http://www.orange-ss.com/column/0067.html

OSは最後の手段なのですが、メインHDDを別HDDに交換できるなら比較的容易に試すことは出来ると思います。
史上最悪のデスペナ さんが書きました: そういえばこんなサイト見つけました

513 回目までは正しく送信できているのですが、 514~1623 まではデータがサーバに届いていません。 その後も、89449~97804、97871~98469、98536~100000 は紛失し、結局届いたのは 100,000 分の 3,618。 到達率 3.6%、つまり
データ損失率 96.4%
というものすごいことになっています。
そのUDPはLinuxっぽいですね。
状況的には史上最悪のデスペナさんにそっくりですが次のような考察がなされています。

「UDP を使ってみよう (3)」
http://x68000.q-e-d.net/~68user/net/udp-3.html

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

Fimbul
記事: 100
登録日時: 8年前

Re: UDPデータ損失率

#66

投稿記事 by Fimbul » 7年前

10回の実行はWin APIを使いました。
結果はbeatleさん、沖さんと同じでした。

環境
・Windows Vista Home Premium Service Pack 2 32[bit]
・Intel Core 2 Duo P8600 2.40[GHz]
・メモリ 4.00[GB]
・ウィルス対策ソフト ウィルスバスター2010
・ファイアウォール ウィルスバスター2010

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

Re: UDPデータ損失率

#67

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

softya(ソフト屋) さんが書きました:受信バッファのあふれではないか?って事みたいです。
史上最悪のデスペナ さんが書きました:結論:sendtoの後ある程度の時間を置かないとバッファ(?)が上書きされるなどの状況が発生し、送信が行われなくなることがある。
送信側の問題かと思ったら確かに受信側の方もありえますね。
softya(ソフト屋) さんが書きました:OSを新規インストールするとか同じPCに別OSをインストールして試してみるとか根幹周りの動作確認が不可欠です。
このPCはリカバリディスク(OS)の付属して無いタイプ(その分安価)なのでインストールは無理ですね・・・・・
softya(ソフト屋) さんが書きました:「CPUに意図的に負荷を掛けて不具合が無いかチェックするフリーソフト「Prime95」 | aquapple (archives)」
12時間も出来るような時が無いのですが12時間じゃなくてもいいのでしょうか?
「パソコン故障を無料ツール「 Ultimate Boot CD 」で検査する」
やってみます。


softya(ソフト屋) さんが書きました:ただ、他にも問題が出そうなものですが
そういえば、一時期ネットに繋ぐと数時間おきにブルースクリーン&強制再起動になったことがあるのですが・・・・・(スタンドアロンでは起こらず)
関係ないかもしれませんが一応報告です。
少し前の話ですが、すぐに直ったのでエラーコードはあいまいですが

STOP: 0x0000002E (<parameter>, <parameter>, <parameter>, <parameter>)
DATA_BUS_ERROR
これは Windows NT Executive の文字モード STOP メッセージです。システム メモリ内のパリティ エラーによって引き起こされるデータ バス エラーを示しています。このエラーは、存在しないアドレスにドライバがアクセスした場合にも発生します。
だったような・・・・・

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: UDPデータ損失率

#68

投稿記事 by beatle » 7年前

もしかしてネットワークボードが不調なのでは.

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

Re: UDPデータ損失率

#69

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

史上最悪のデスペナ さんが書きました:このPCはリカバリディスク(OS)の付属して無いタイプ(その分安価)なのでインストールは無理ですね・・・・・
リカバリディスク(OS)が付属していなくてもリカバリ方法は提供されているはずです。
考えられるのは別パーティションにリカバリ用のシステムが搭載されているものもあります。
あるいは、リカバリーディスクを作る方法がマニュアルに掲載されているものもあります。
どちらにしてもパソコン付属のマニュアルを確認して下さい。なんらかのリカバリ方法が提供されているはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#70

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

リカバリの提供方法→自分でディスクを作ってください

買った当時、何故かディスクが作れずサポートも応答無し。
しばらくして返答があるも、リカバリディスク作成用ディスクを別のメーカーのに買い換えてくれ、という回答

ただでさえディスク使わないのに買うのも嫌だったので結局買わず→今に至る

自業自得といえば自業自得なのですが不具合が出ている今作っても意味が無いのではないかと思えるので・・・・・・・
softya(ソフト屋) さんが書きました:「パソコン故障を無料ツール「 Ultimate Boot CD 」で検査する」
手順を印刷しないといけませんが明日にならないと印刷できる環境にならないので明日やる予定です

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

Re: UDPデータ損失率

#71

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

リカバリ用のイメージは別に保存されているので使える可能性が高いです。
まぁ、CPUやメモリに異常がない場合に限りですが。

ディスクを使わないみたいですが、今まで作ったプログラムやデータはどうやって保存されているんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#72

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

無くなったら絶望するような自作プログラム→覚えてたら(気が向いたら)USBに保存
無くなったらがっかりするけどまあ、諦めれる漫画とかアニメとか小説とか→好きな小説はUSBに保存
その他全て→バックアップ無し

ちなみにUSBは8GB一個だけです。

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

Re: UDPデータ損失率

#73

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

なかなかスリリングなバックアップ方法です。
ぜひ、DVD-Rを買ってリカバリディスクの作成をお勧めします。
50枚のスピンドルで買っても1200~1300円ぐらい10枚なら割高ですが500円ぐらいで買えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
lriki
記事: 88
登録日時: 8年前

Re: UDPデータ損失率

#74

投稿記事 by lriki » 7年前

あんまり関係ないかもしれませんけど、バージョンが2.2なのにWSAStartupに2.0を要求して大丈夫なんでしょうか。
WSAStartup(MAKEWORD(2,2), &wsaData);
としてみてらどうでしょう。
何かの見間違いでしたらすみません。


投稿ついでに、自分のノートでも試してみました。

Windows Vista Business SP2 32bit
Celeron 585(2.16GHz)
メモリ 3GB
ウィルス対策ソフト:ウィルスバスター
ファイアウォール:Windowsファイアウォール

とりあえず20回で100%でした。

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

Re: UDPデータ損失率

#75

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

梨樹 さんが書きました:あんまり関係ないかもしれませんけど、バージョンが2.2なのにWSAStartupに2.0を要求して大丈夫なんでしょうか。
WSAStartup(MAKEWORD(2,2), &wsaData);
としてみてらどうでしょう。
何かの見間違いでしたらすみません。
確かに!
・・・・・でも、残念ですが結果は変わりませんでしたorz
完全成功率・・・・・・20%(4回/20回)、不完全成功率・・・・・・5%(1回/20回)
相変わらず、全てのsendtoの後にSleep(1)を入れると100%です
softya(ソフト屋) さんが書きました:50枚のスピンドルで買っても1200~1300円ぐらい10枚なら割高ですが500円ぐらいで買えます。
50枚組980円で買ったのがリカバリできません、と言われて残り49枚が使われぬままもうすぐ2年が経ちますね~
DVD-Rだから使い捨てみたいなものだし・・・・・・長期保存するようなの無いですし・・・・・

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

Re: UDPデータ損失率

#76

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

史上最悪のデスペナ さんが書きました:50枚組980円で買ったのがリカバリできません、と言われて残り49枚が使われぬままもうすぐ2年が経ちますね~
DVD-Rだから使い捨てみたいなものだし・・・・・・長期保存するようなの無いですし・・・・・
国産メーカーじゃない香りがする値段ですね。まぁ、国産でもたまに失敗しますけど。太陽誘電よりもTDK国産の方が失敗する確率が低い気がしますのでメーカー製を買われたほうが良いと思います。
私の場合VisualStduioExpressのISOイメージ焼いたり、OSのお試し版を焼いて保存しておいたり、ParagonBackupのリカバリ用のイメージを焼いておいたりそれなりに使いますけど・・・。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#77

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

そうだ、基本事項が抜けてました。このPCはノートです

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

Re: UDPデータ損失率

#78

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

史上最悪のデスペナ さんが書きました:そうだ、基本事項が抜けてました。このPCはノートです
それは失敗する利用になりません。
本質的な問題ではないので関係ないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: UDPデータ損失率

#79

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

近くに電気店が無いので、売ってるとこに行こうとするとまとまった時間がなかなか取れないんですよね^^;
USB一個じゃ足りないので、安売りしてると欲しいと思うのですが結局行けずに諦めたり・・・・・・
出来るだけ早く対処しなければならないのは分かってるんですが・・・・・・

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: UDPデータ損失率

#80

投稿記事 by beatle » 7年前

Amazonいいですよ.どんなに少額でも配送料無料ですし.配送速いですし.

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

Re: UDPデータ損失率

#81

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

史上最悪のデスペナ さんが書きました:近くに電気店が無いので、売ってるとこに行こうとするとまとまった時間がなかなか取れないんですよね^^;
USB一個じゃ足りないので、安売りしてると欲しいと思うのですが結局行けずに諦めたり・・・・・・
出来るだけ早く対処しなければならないのは分かってるんですが・・・・・・
ディスクを買う方が、突然OSが起動しなくってOSを買うだけのために2万円を出すよりよっぽど良いと思うんですが。
「Amazon.co.jp: Windows 7 Home Premium 通常版 Service Pack 1 適用済み: ソフトウェア」

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

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

Re: UDPデータ損失率

#82

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

softya(ソフト屋) さんが書きました:「パソコン故障を無料ツール「 Ultimate Boot CD 」で検査する」
何故かCDに焼けなかったです・・・・・・

リカバリディスクは作成できました。

beatle
記事: 1280
登録日時: 8年前
住所: 埼玉
連絡を取る:

Re: UDPデータ損失率

#83

投稿記事 by beatle » 7年前

ISOの焼き方を知らず,ISOファイルを通常のファイルのようにCD-Rに書きこんでいるとかでしょうか.
ISOはCD全体の完全なイメージファイルですので,ISOを普通のファイルと同じ感覚でCD-Rに書きこんでも意味ありません.

CDのライティングソフトに,ISO書き込みモードとか,トラックイメージの書き込みとかいうメニューはありませんか?

閉鎖

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