ページ 11

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 16:49
by softya(ソフト屋)
と言うことは史上最悪のデスペナさんの送信側プログラムに何らかの問題があると考えるのが妥当かと思います。
ところでWinscok2はws2_32.libを使われていますよね?

Re: UDPデータ損失率

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

Re: UDPデータ損失率

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

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


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

Re: UDPデータ損失率

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

[追記]史上最悪のデスペナさんがリリースビルドしたプログラムを添付してもらって良いですか?
ソースレベルではなくexeレベルでチェックしたいです。

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 18:14
by 史上最悪のデスペナ
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 スキップ ==========

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 18:16
by softya(ソフト屋)
送信プログラムをリリースビルドして出来上がったexeをZIP圧縮して、ここに添付してもらうだけで良いです。

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 18:24
by 史上最悪のデスペナ
史上最悪のデスペナ さんが書きました:合ってるかはわかりませんが、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モードでは以上のようなエラーが出てビルドできませんでした

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 18:27
by softya(ソフト屋)
ライブラリの指定はDebugとReleaseで別に行う必要があります。

環境依存な方法としては
#pragma comment(lib,"ws2_32.lib")
とソースプログラム中に書いてしまう方法もあります。

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 21:36
by 史上最悪のデスペナ
よろしくお願いします
01.zip
(3.37 KiB) ダウンロード数: 147 回

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 21:40
by softya(ソフト屋)
出力先のポート番号は幾つでしょうか?

Re: UDPデータ損失率

Posted: 2012年1月23日(月) 21:46
by 史上最悪のデスペナ
例のツールのポート番号が4000だったのでそれにあわせたままです

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 00:01
by softya(ソフト屋)
試した所100%届きました。
と言うことは史上最悪のデスペナさんのOS、ファイアウォール、ウィルス対策ソフト,winsock2のdllあたりが怪しいと思います。

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 07:06
by 史上最悪のデスペナ
OSに関してはどうしようもないのですが・・・・・・
ファイアウォールとウィルス対策ソフトは切ったりしてやってみます。
dllはどっかから落としてくるのですかね?

Re: UDPデータ損失率

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

コード:

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

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 09:02
by softya(ソフト屋)
デバッカを介さず直接exeを起動しても同じぐらいの確率ですか?

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 12:32
by 史上最悪のデスペナ
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回)

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 12:54
by softya(ソフト屋)
既に聞いたことのない未知の領域ですので、こうなったら細かい所をチェックして行きましょう。

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

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

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

これらで治らないならOSの再インストールなど大掛かりな作業をするしか無い気がしてきました。

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 18:36
by 史上最悪のデスペナ
(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のみの送信となる

という結果になりました

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 19:04
by softya(ソフト屋)
WSAGetLastError()だけでなく全部の戻り値をチェックして下さい。

あとServerAddrの内容をクリアしたらどうなります?
memset(&ServerAddr, 0x00, siezof(ServerAddr));

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 20:23
by 史上最悪のデスペナ
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));
これはどこに入れたらいいんでしょう?

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 21:08
by softya(ソフト屋)
memset(&ServerAddr, 0x00, siezof(ServerAddr));は宣言の直後ですね。
なんか、今までの話を総合するとSleep(100)とか入れたら成功したりして。これまmemsetと別に実験して下さい。

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 22:03
by 史上最悪のデスペナ
エラーチェック、戻りチェック一切なし&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をインクルードしても関数定義が無いとエラーが出て使えません

Re: UDPデータ損失率

Posted: 2012年1月24日(火) 22:29
by softya(ソフト屋)
この事実から、私が予想するのはsendto()からclosesocket()の間にSleepが必要なのではないか?って事なのですが実験してもらえますか?ほかはSleepを外して下さい。

[追記]usleepやnanosleepはUnix/Linux用です。

Re: UDPデータ損失率

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

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 09:40
by softya(ソフト屋)
うーん。万策尽きました。
史上最悪のデスペナさんの状態が一般的な問題なのか広く普通にある状態なのか分からないのですが、Sleep(はごまかしに過ぎませんので最終最悪の手段でしかありません。
たまたま、上手く行っているように見えるだけかも知れません。

マイクロソフトの公式なサンプルは、この形ですのでこの形で上手くいかないのならOSやDLLやレジストリなどに何らかの異常があると判断したほうがよさそうです。
「sendto function」
http://msdn.microsoft.com/en-us/library ... s.85).aspx

Re: UDPデータ損失率

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

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 10:01
by softya(ソフト屋)
beatleさんにもNo: 39 を試してもらいたいのですが、私の所では成功しますが史上最悪のデスペナさんの所では失敗する可能性のあるプログラムです。

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 10:55
by beatle
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"を受信します.

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 11:01
by beatle
ちなみに私の環境は
Windows 7 Ultimate SP1 64bit
Intel Core i7 960 3.2GHz
6.0GB RAM
となっています.

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 11:37
by softya(ソフト屋)
ありがとうございます。
やはり環境問題なのかなって気がしてきました。

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

【補足】他にもここを読んでいてテスト可能な方はテストをお願いします。

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 13:18
by 沖 滉均
ちょっと試してみました
手順はbeatleさんと一緒

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

[確認環境]
Windows XP Professional SP3 32bit
Intel Core2 Duo P8600 2.4GHz
メモリ 2GB
ウィルス対策ソフト:Symantec Endpoint Protection

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 16:16
by 史上最悪のデスペナ
みなさんありがとうございます。

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

です

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

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 16:47
by softya(ソフト屋)
ついでにXPでも試して見ました。

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

20回で100%でした。

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 17:43
by 史上最悪のデスペナ
corei5が駄目・・・・・・なんでしょうか?

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

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 18:02
by softya(ソフト屋)
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

受信バッファのあふれではないか?って事みたいです。

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 18:39
by Fimbul
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

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 18:41
by 史上最悪のデスペナ
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 メッセージです。システム メモリ内のパリティ エラーによって引き起こされるデータ バス エラーを示しています。このエラーは、存在しないアドレスにドライバがアクセスした場合にも発生します。
だったような・・・・・

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 18:42
by beatle
もしかしてネットワークボードが不調なのでは.

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 18:48
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:このPCはリカバリディスク(OS)の付属して無いタイプ(その分安価)なのでインストールは無理ですね・・・・・
リカバリディスク(OS)が付属していなくてもリカバリ方法は提供されているはずです。
考えられるのは別パーティションにリカバリ用のシステムが搭載されているものもあります。
あるいは、リカバリーディスクを作る方法がマニュアルに掲載されているものもあります。
どちらにしてもパソコン付属のマニュアルを確認して下さい。なんらかのリカバリ方法が提供されているはずです。

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 21:42
by 史上最悪のデスペナ
リカバリの提供方法→自分でディスクを作ってください

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

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

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

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 21:47
by softya(ソフト屋)
リカバリ用のイメージは別に保存されているので使える可能性が高いです。
まぁ、CPUやメモリに異常がない場合に限りですが。

ディスクを使わないみたいですが、今まで作ったプログラムやデータはどうやって保存されているんでしょうか?

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 21:52
by 史上最悪のデスペナ
無くなったら絶望するような自作プログラム→覚えてたら(気が向いたら)USBに保存
無くなったらがっかりするけどまあ、諦めれる漫画とかアニメとか小説とか→好きな小説はUSBに保存
その他全て→バックアップ無し

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

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 22:02
by softya(ソフト屋)
なかなかスリリングなバックアップ方法です。
ぜひ、DVD-Rを買ってリカバリディスクの作成をお勧めします。
50枚のスピンドルで買っても1200~1300円ぐらい10枚なら割高ですが500円ぐらいで買えます。

Re: UDPデータ損失率

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


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

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

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

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 22:20
by 史上最悪のデスペナ
梨樹 さんが書きました:あんまり関係ないかもしれませんけど、バージョンが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だから使い捨てみたいなものだし・・・・・・長期保存するようなの無いですし・・・・・

Re: UDPデータ損失率

Posted: 2012年1月25日(水) 23:35
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:50枚組980円で買ったのがリカバリできません、と言われて残り49枚が使われぬままもうすぐ2年が経ちますね~
DVD-Rだから使い捨てみたいなものだし・・・・・・長期保存するようなの無いですし・・・・・
国産メーカーじゃない香りがする値段ですね。まぁ、国産でもたまに失敗しますけど。太陽誘電よりもTDK国産の方が失敗する確率が低い気がしますのでメーカー製を買われたほうが良いと思います。
私の場合VisualStduioExpressのISOイメージ焼いたり、OSのお試し版を焼いて保存しておいたり、ParagonBackupのリカバリ用のイメージを焼いておいたりそれなりに使いますけど・・・。

Re: UDPデータ損失率

Posted: 2012年1月26日(木) 08:15
by 史上最悪のデスペナ
そうだ、基本事項が抜けてました。このPCはノートです

Re: UDPデータ損失率

Posted: 2012年1月26日(木) 09:37
by softya(ソフト屋)
史上最悪のデスペナ さんが書きました:そうだ、基本事項が抜けてました。このPCはノートです
それは失敗する利用になりません。
本質的な問題ではないので関係ないと思います。

Re: UDPデータ損失率

Posted: 2012年1月26日(木) 18:02
by 史上最悪のデスペナ
近くに電気店が無いので、売ってるとこに行こうとするとまとまった時間がなかなか取れないんですよね^^;
USB一個じゃ足りないので、安売りしてると欲しいと思うのですが結局行けずに諦めたり・・・・・・
出来るだけ早く対処しなければならないのは分かってるんですが・・・・・・

Re: UDPデータ損失率

Posted: 2012年1月26日(木) 18:08
by beatle
Amazonいいですよ.どんなに少額でも配送料無料ですし.配送速いですし.

Re: UDPデータ損失率

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

修理に出しても同じぐらい取られると思います。

Re: UDPデータ損失率

Posted: 2012年1月27日(金) 16:26
by 史上最悪のデスペナ
softya(ソフト屋) さんが書きました:「パソコン故障を無料ツール「 Ultimate Boot CD 」で検査する」
何故かCDに焼けなかったです・・・・・・

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

Re: UDPデータ損失率

Posted: 2012年1月27日(金) 17:07
by beatle
ISOの焼き方を知らず,ISOファイルを通常のファイルのようにCD-Rに書きこんでいるとかでしょうか.
ISOはCD全体の完全なイメージファイルですので,ISOを普通のファイルと同じ感覚でCD-Rに書きこんでも意味ありません.

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