UDPデータ損失率
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
WAN越しの損失率は計測したことが無いですがLAN内で同一PC内にしては失敗しすぎな気がします。成功するまでの回数ですよね?
元のプログラムに成功までの計測機能がないようですがどうやって計測したのでしょうか?プログラム自体や計測方法の問題である可能性も十分にあります。
元のプログラムに成功までの計測機能がないようですがどうやって計測したのでしょうか?プログラム自体や計測方法の問題である可能性も十分にあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
当方では100%届きます。
ファイアウォールとかなにか邪魔してませんか?
ファイアウォールとかなにか邪魔してませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
そのUDPポートが既に使われているのかも知れません。
送受信のUDPポート番号を変えてみてください。
送受信のUDPポート番号を変えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
と言うことであればwireSharkでパケットをキャプチャしてみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
ネットで使い方いろいろ見てるんですが良く分からないです・・・・・・
分かるまでお待ちいただけますか?
分かるまでお待ちいただけますか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
私も書いていて不安になりました。史上最悪のデスペナ さんが書きました:ネットで使い方いろいろ見てるんですが良く分からないです・・・・・・
分かるまでお待ちいただけますか?
127.0.0.1のパケットってキャプチャ出来たっけ?
こちらでも調べてみます。こっちも時間がかかるのでお待ちください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
ループバックアドレスはNIC通らないので(デフォルトでは)キャプチャできなかったきがします
なにかうまい方法があればいいんですが・・・・
(短文ですみません。)
なにかうまい方法があればいいんですが・・・・
(短文ですみません。)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
ごまかす技を幾つか試して見ましたがwindows7は頑固ですね。今のところダメです。
VMwarePlayerとか使って仮想PCとの間ならやり取りテストできるかも知れませんがLinuxで受信ソフト組むことになるので手間を考えて保留中。
VMwarePlayerとか使って仮想PCとの間ならやり取りテストできるかも知れませんがLinuxで受信ソフト組むことになるので手間を考えて保留中。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
データ損失率と関係あるのか分かりませんが、
recvではなくrecvfromを使うと数十回レベルじゃ受信されないようです。
recvではなくrecvfromを使うと数十回レベルじゃ受信されないようです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
とりあえずパケット送信を確認したいので宛先IPアドレス1.1.1.1に指定してUDPパケットを送信してみてください。史上最悪のデスペナ さんが書きました:データ損失率と関係あるのか分かりませんが、
recvではなくrecvfromを使うと数十回レベルじゃ受信されないようです。
これを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(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
20回中7回観測されました
毎回2行目と3行目が違うようです
毎回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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
と言うことはロストということよりもパケットが生成出来ていないということですね。
送信処理でエラーチェックをしていないので、WSAStartup()/socket()/sendto()など関数でエラーが起きていないかチェックしてみてください。
ゲーム公開を目指している以上エラー処理も重要ですからね。良い勉強と思ってやってみましょう。
送信処理でエラーチェックをしていないので、WSAStartup()/socket()/sendto()など関数でエラーが起きていないかチェックしてみてください。
ゲーム公開を目指している以上エラー処理も重要ですからね。良い勉強と思ってやってみましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
ということは結構な頻度でパケット生成が出来てないことに・・・・・・・
そういうことはありえるものなのでしょうか?
現在エラー処理作成中です
そういうことはありえるものなのでしょうか?
現在エラー処理作成中です
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
聞いたことが無いですが何らかのファイアウォールなどが中途半端に動作していないとパケットの送信成功とロストの割合が考えられないです。後はネットワークドライバの不良とか。史上最悪のデスペナ さんが書きました:ということは結構な頻度でパケット生成が出来てないことに・・・・・・・
そういうことはありえるものなのでしょうか?
現在エラー処理作成中です
全て私は経験したことないレベルですね。ネットワーク系の仕事をした事が無いのでよく有る事なのか断言はできませんが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
次のようにエラー処理を行ったところ、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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
今のコードだとエラーリトライしていることが確認できませんのでエラーを表示したほうが良いと思います。
それとWSAStartup()で成功してもsocket()でエラーだとWSAStartup()をもう一度やるのもマズイと思います。
あとsendto()もエラーチェックできませんか? SOCKET_ERRORとか送信バイト数と食い違うことで確認できると思います。
[補足] エラー処理を丁寧に書く癖をつけておかないとバグの原因がつかめず苦労することになります。特に配布したプログラムでバグると配布先でしか起こらないバグだったりするので、エラー時の処理を埋め込んでおくことは重要ですよ。
それとWSAStartup()で成功してもsocket()でエラーだとWSAStartup()をもう一度やるのもマズイと思います。
あとsendto()もエラーチェックできませんか? SOCKET_ERRORとか送信バイト数と食い違うことで確認できると思います。
[補足] エラー処理を丁寧に書く癖をつけておかないとバグの原因がつかめず苦労することになります。特に配布したプログラムでバグると配布先でしか起こらないバグだったりするので、エラー時の処理を埋め込んでおくことは重要ですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
おそらくですが、理由が分かりました。
VC++のせいです。
すべての箇所にエラー確認を埋め込んで実行してもエラーが起きないのにWireSharkにも反応が無いからおかしいと何度もやっていたら
とうとうビルドしたらソースが参照できませんとか出てきまして
再度最初からプロジェクトを作り直したところ、上手くいきました。
本当にお騒がせしました。
VC++のせいです。
すべての箇所にエラー確認を埋め込んで実行してもエラーが起きないのにWireSharkにも反応が無いからおかしいと何度もやっていたら
とうとうビルドしたらソースが参照できませんとか出てきまして
再度最初からプロジェクトを作り直したところ、上手くいきました。
本当にお騒がせしました。
Re: UDPデータ損失率
と上手く終わりませんでした。受信側もエラー確認を作り、新しく作成したプロジェクトに書いたのにもかかわらず
今度は全く受信されません!
やはりデバッグモードでやると
利用可能ソースがありません
だそうです。
VC++を入れなおしてみます
今度は全く受信されません!
やはりデバッグモードでやると
利用可能ソースがありません
だそうです。
VC++を入れなおしてみます
Re: UDPデータ損失率
やはり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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
1.1.1.1の送信成功率を教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
こちらでは最新コードでも100%受信されます。
他の人の作ったツールでテストしてみてください。
「UDP/IPテストツールの詳細情報 : Vector ソフトを探す!」
http://www.vector.co.jp/soft/winnt/net/se478370.html
このツール相手に送信と受信をそれぞれテストを行なって下さい。
こちらでは問題なく送受信されました。
他の人の作ったツールでテストしてみてください。
「UDP/IPテストツールの詳細情報 : Vector ソフトを探す!」
http://www.vector.co.jp/soft/winnt/net/se478370.html
このツール相手に送信と受信をそれぞれテストを行なって下さい。
こちらでは問題なく送受信されました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
送信成功率・・・・・・・・25%(5回/20回)
受信成功率・・・・・・・・100%
でした。IPアドレスが127.0.0.1なのでWireSharkでは確認できませんでした
受信成功率・・・・・・・・100%
でした。IPアドレスが127.0.0.1なのでWireSharkでは確認できませんでした
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
どちらからどちらでしょうか?史上最悪のデスペナ さんが書きました:送信成功率・・・・・・・・25%(5回/20回)
受信成功率・・・・・・・・100%
でした。IPアドレスが127.0.0.1なのでWireSharkでは確認できませんでした
UDP/IPテストツール → 史上最悪のデスペナさんの受信プログラム が送信成功率? それとも逆ですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
と言うことは史上最悪のデスペナさんの送信側プログラムに何らかの問題があると考えるのが妥当かと思います。
ところでWinscok2はws2_32.libを使われていますよね?
ところでWinscok2はws2_32.libを使われていますよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
ひとつ思ったのですが,「送信エラー」等の出力時に,WSAGetLastError APIの値は確認していますか。
WSAStartupでも確認せずにループをしているあたり,エラー処理が全然なされていないのではないか,という気がしますが。
# WSAStartupの失敗は致命的なエラー扱いでいいと思う……。
WSAStartupでも確認せずにループをしているあたり,エラー処理が全然なされていないのではないか,という気がしますが。
# WSAStartupの失敗は致命的なエラー扱いでいいと思う……。
Re: UDPデータ損失率
最初にWinsockについて調べたときにここで
ws2_32.libに書き換えましたが、
25%→45%(9回/20回)になっただけでした
値は全く確認してませんね、確かに。それを入れてきます
追記
以降、特に明記しない限り
送信:私の送信プログラムが送信すること
受信:私の受信プログラムが受信すること
とします
と書いてあったのでそれをリンクしてました。それ以降、他のサイトではその部分を流していたので・・・・・WinSockを使うにはちょっとクセがあって、[wsock32.lib]というライブラリーにリンクせねばなりません。
ws2_32.libに書き換えましたが、
25%→45%(9回/20回)になっただけでした
値は全く確認してませんね、確かに。それを入れてきます
追記
以降、特に明記しない限り
送信:私の送信プログラムが送信すること
受信:私の受信プログラムが受信すること
とします
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
ws2_32.libはWinSock2.h用でwsock32.libはWinSock.h用です。バージョンが違うので注意して下さい。
それと連続5回通信とかの機能を入れてみてください。送信文字列はHELLO0~HELLO4と変化するのが望ましいです。
これは、一回の送信毎に確率的に失敗するのか、何らかの初期化周りが成功すれば連続送信が成功するのか知りたいためです。
[追記]史上最悪のデスペナさんがリリースビルドしたプログラムを添付してもらって良いですか?
ソースレベルではなくexeレベルでチェックしたいです。
それと連続5回通信とかの機能を入れてみてください。送信文字列はHELLO0~HELLO4と変化するのが望ましいです。
これは、一回の送信毎に確率的に失敗するのか、何らかの初期化周りが成功すれば連続送信が成功するのか知りたいためです。
[追記]史上最悪のデスペナさんがリリースビルドしたプログラムを添付してもらって良いですか?
ソースレベルではなくexeレベルでチェックしたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
ごめんなさい、これのやり方がわかりません。教えてください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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
送信プログラムをリリースビルドして出来上がったexeをZIP圧縮して、ここに添付してもらうだけで良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
編集が遅かったのでお返事を既に頂いていたようですね。史上最悪のデスペナ さんが書きました:合ってるかはわかりませんが、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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
ライブラリの指定はDebugとReleaseで別に行う必要があります。
環境依存な方法としては
#pragma comment(lib,"ws2_32.lib")
とソースプログラム中に書いてしまう方法もあります。
環境依存な方法としては
#pragma comment(lib,"ws2_32.lib")
とソースプログラム中に書いてしまう方法もあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
出力先のポート番号は幾つでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
試した所100%届きました。
と言うことは史上最悪のデスペナさんのOS、ファイアウォール、ウィルス対策ソフト,winsock2のdllあたりが怪しいと思います。
と言うことは史上最悪のデスペナさんのOS、ファイアウォール、ウィルス対策ソフト,winsock2のdllあたりが怪しいと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
OSに関してはどうしようもないのですが・・・・・・
ファイアウォールとウィルス対策ソフトは切ったりしてやってみます。
dllはどっかから落としてくるのですかね?
ファイアウォールとウィルス対策ソフトは切ったりしてやってみます。
dllはどっかから落としてくるのですかね?
Re: UDPデータ損失率
まだ、これ出来てませんがファイアウォールやセキュリティソフトを切ったときの送信テストは以下のようになりましたsoftya(ソフト屋) さんが書きました:それと連続5回通信とかの機能を入れてみてください。送信文字列はHELLO0~HELLO4と変化するのが望ましいです。
これは、一回の送信毎に確率的に失敗するのか、何らかの初期化周りが成功すれば連続送信が成功するのか知りたいためです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
デバッカを介さず直接exeを起動しても同じぐらいの確率ですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
はい。そうですsoftya(ソフト屋) さんが書きました:デバッカを介さず直接exeを起動しても同じぐらいの確率ですか?
部分を
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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
既に聞いたことのない未知の領域ですので、こうなったら細かい所をチェックして行きましょう。
(1)windows updateを徹底的に行う。
(2)winsock2のバージョンを確認。
「WinSockの情報」
http://wisdom.sakura.ne.jp/system/winap ... Sock2.html
(3)WSAGetLastErrorなどでエラーをチェックしまくる。
closesocket()などもチェックして下さい。もしかしたらパケット送出に失敗した戻り値が戻るかも知れません。
リトライはしなくて良いですが、エラーの詳細を表示して終了して下さい。
これらで治らないならOSの再インストールなど大掛かりな作業をするしか無い気がしてきました。
(1)windows updateを徹底的に行う。
(2)winsock2のバージョンを確認。
「WinSockの情報」
http://wisdom.sakura.ne.jp/system/winap ... Sock2.html
(3)WSAGetLastErrorなどでエラーをチェックしまくる。
closesocket()などもチェックして下さい。もしかしたらパケット送出に失敗した戻り値が戻るかも知れません。
リトライはしなくて良いですが、エラーの詳細を表示して終了して下さい。
これらで治らないならOSの再インストールなど大掛かりな作業をするしか無い気がしてきました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
(1)windows updateを徹底的に行う。→クリア
(2)winsock2のバージョンを確認。→
より2.2と表示された
(3)WSAGetLastErrorなどでエラーをチェックしまくる。→
意味不明な挙動
だと、すべて0なのに送れなかったり、送れてもHello0だけだったり。
こうすると全て100%送信可。ただし、ブレイクポイントをreturn0に設定しておき、ブレイクポイントでの強制終了すると
次の数回は送れないか、またはHELLO0のみの送信となる
という結果になりました
(2)winsock2のバージョンを確認。→
printf("バージョン = %d.%d\n記述 = %s\n状態 = %s\n" ,
(BYTE)wsaData.wHighVersion , wsaData.wHighVersion >> 8 ,
wsaData.szDescription , wsaData.szSystemStatus
);
(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;
}
#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;
}
次の数回は送れないか、またはHELLO0のみの送信となる
という結果になりました
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
WSAGetLastError()だけでなく全部の戻り値をチェックして下さい。
あとServerAddrの内容をクリアしたらどうなります?
memset(&ServerAddr, 0x00, siezof(ServerAddr));
あとServerAddrの内容をクリアしたらどうなります?
memset(&ServerAddr, 0x00, siezof(ServerAddr));
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
WSAGetLastError()を無くして戻り値だけのチェックsoftya(ソフト屋) さんが書きました: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;
}
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;
}
なので少しコードを変えて送信ごとにチェック
前略
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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
memset(&ServerAddr, 0x00, siezof(ServerAddr));は宣言の直後ですね。
なんか、今までの話を総合するとSleep(100)とか入れたら成功したりして。これまmemsetと別に実験して下さい。
なんか、今までの話を総合するとSleep(100)とか入れたら成功したりして。これまmemsetと別に実験して下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
エラーチェック、戻りチェック一切なし&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をインクルードしても関数定義が無いとエラーが出て使えません
→完全成功率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
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
この事実から、私が予想するのはsendto()からclosesocket()の間にSleepが必要なのではないか?って事なのですが実験してもらえますか?ほかはSleepを外して下さい。
[追記]usleepやnanosleepはUnix/Linux用です。
[追記]usleepやnanosleepはUnix/Linux用です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
これも実験しました。softya(ソフト屋) さんが書きました:この事実から、私が予想するのはsendto()からclosesocket()の間にSleepが必要なのではないか?って事なのですが実験してもらえますか?ほかはSleepを外して下さい。
と同じ結果になりました。史上最悪のデスペナ さんが書きました:エラーチェック、戻りチェック一切なし&memset無し&一部のsendto後のみSleep(100)
→その後にSleepしなかったsendtoは送信されないことあり。
追記:Hello0に限ってはそれのみ送信されることもある
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
うーん。万策尽きました。
史上最悪のデスペナさんの状態が一般的な問題なのか広く普通にある状態なのか分からないのですが、Sleep(はごまかしに過ぎませんので最終最悪の手段でしかありません。
たまたま、上手く行っているように見えるだけかも知れません。
マイクロソフトの公式なサンプルは、この形ですのでこの形で上手くいかないのならOSやDLLやレジストリなどに何らかの異常があると判断したほうがよさそうです。
「sendto function」
http://msdn.microsoft.com/en-us/library ... s.85).aspx
史上最悪のデスペナさんの状態が一般的な問題なのか広く普通にある状態なのか分からないのですが、Sleep(はごまかしに過ぎませんので最終最悪の手段でしかありません。
たまたま、上手く行っているように見えるだけかも知れません。
マイクロソフトの公式なサンプルは、この形ですのでこの形で上手くいかないのならOSやDLLやレジストリなどに何らかの異常があると判断したほうがよさそうです。
「sendto function」
http://msdn.microsoft.com/en-us/library ... s.85).aspx
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
的はずれな回答かもですが,同じ送信先にsendtoすると失敗する,みたいなことはないでしょうか.違う送信先なら連続でやっても成功するとか.
同じ送信先に連続でsendtoすることはあまり考慮されていないのかもって思ったんです.
同じ送信先に送るデータは一つの配列にまとめればいいだけの話ですからね.
同じ送信先に連続でsendtoすることはあまり考慮されていないのかもって思ったんです.
同じ送信先に送るデータは一つの配列にまとめればいいだけの話ですからね.
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
beatleさんにもNo: 39 を試してもらいたいのですが、私の所では成功しますが史上最悪のデスペナさんの所では失敗する可能性のあるプログラムです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
No.27
まずUDP/IPテストツールで,ポート番号などいじらず,「接続」ボタンを押して接続しました.
次に,01.exeをターミナル上で実行したところ,UDP/IPテストツールのログ表示部分に
「->受 127.0.0.1 (49702)HELLO」
と表示されました.
bashスクリプトを利用し,連続で10回01.exeを実行したところ,ポート番号(49702)がインクリメントされる以外は初回と同様に受信されました.
「10回送信」を何度繰り返しても,その都度10回"HELLO"を受信します.
とNo.39softya(ソフト屋) さんが書きました: 「UDP/IPテストツールの詳細情報 : Vector ソフトを探す!」
http://www.vector.co.jp/soft/winnt/net/se478370.html
を組み合わせて,01.exe -> UDP/IPテストツールのテストを試みました.史上最悪のデスペナ さんが書きました: よろしくお願いします
01.zip
まずUDP/IPテストツールで,ポート番号などいじらず,「接続」ボタンを押して接続しました.
次に,01.exeをターミナル上で実行したところ,UDP/IPテストツールのログ表示部分に
「->受 127.0.0.1 (49702)HELLO」
と表示されました.
bashスクリプトを利用し,連続で10回01.exeを実行したところ,ポート番号(49702)がインクリメントされる以外は初回と同様に受信されました.
「10回送信」を何度繰り返しても,その都度10回"HELLO"を受信します.
Re: UDPデータ損失率
ちなみに私の環境は
Windows 7 Ultimate SP1 64bit
Intel Core i7 960 3.2GHz
6.0GB RAM
となっています.
Windows 7 Ultimate SP1 64bit
Intel Core i7 960 3.2GHz
6.0GB RAM
となっています.
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
ありがとうございます。
やはり環境問題なのかなって気がしてきました。
私は
Windows7 business sp1 64bit
AMD Athlon(tm) II X4 630 Processor 2.8GHz
メモリ 4GB
ウィルス対策ソフト:ウィルスバスター
ファイアウォール:Windowsファイアウォール
です。
【補足】他にもここを読んでいてテスト可能な方はテストをお願いします。
やはり環境問題なのかなって気がしてきました。
私は
Windows7 business sp1 64bit
AMD Athlon(tm) II X4 630 Processor 2.8GHz
メモリ 4GB
ウィルス対策ソフト:ウィルスバスター
ファイアウォール:Windowsファイアウォール
です。
【補足】他にもここを読んでいてテスト可能な方はテストをお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
ちょっと試してみました
手順はbeatleさんと一緒
perlで01.exeを連続10回実行させてみましたが
こちらでもポート番号が初回受信時からインクリメントされる以外は初回と同様に受信できました。
[確認環境]
Windows XP Professional SP3 32bit
Intel Core2 Duo P8600 2.4GHz
メモリ 2GB
ウィルス対策ソフト:Symantec Endpoint Protection
手順はbeatleさんと一緒
perlで01.exeを連続10回実行させてみましたが
こちらでもポート番号が初回受信時からインクリメントされる以外は初回と同様に受信できました。
[確認環境]
Windows XP Professional SP3 32bit
Intel Core2 Duo P8600 2.4GHz
メモリ 2GB
ウィルス対策ソフト:Symantec Endpoint Protection
Re: UDPデータ損失率
みなさんありがとうございます。
私の環境は
Windows7 HomePremium SP1 64bit
IntelCorei5 2.66GHz
メモリ 4.00GB
ウィルス対策ソフト KingsoftAntivirus
ファイアウォール Windowsファイアウォール
です
現在レジストリ修復ツール・デフラグツールを使って精査中です
(まあ、精査中といってもプログラムを走らせてエラーがあったらエラー修復ボタンを押すだけなんですが)
私の環境は
Windows7 HomePremium SP1 64bit
IntelCorei5 2.66GHz
メモリ 4.00GB
ウィルス対策ソフト KingsoftAntivirus
ファイアウォール Windowsファイアウォール
です
現在レジストリ修復ツール・デフラグツールを使って精査中です
(まあ、精査中といってもプログラムを走らせてエラーがあったらエラー修復ボタンを押すだけなんですが)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
ついでにXPでも試して見ました。
WindowsXP SP3 32bit
VMware Player
ウィルス対策ソフト:Avira Antivir Personal
ファイアウォール:Windowsファイアウォール
20回で100%でした。
WindowsXP SP3 32bit
VMware Player
ウィルス対策ソフト:Avira Antivir Personal
ファイアウォール:Windowsファイアウォール
20回で100%でした。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
corei5が駄目・・・・・・なんでしょうか?
そういえばこんなサイト見つけました
そういえばこんなサイト見つけました
だそうです。513 回目までは正しく送信できているのですが、 514~1623 まではデータがサーバに届いていません。 その後も、89449~97804、97871~98469、98536~100000 は紛失し、結局届いたのは 100,000 分の 3,618。 到達率 3.6%、つまり
データ損失率 96.4%
というものすごいことになっています。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
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に交換できるなら比較的容易に試すことは出来ると思います。
状況的には史上最悪のデスペナさんにそっくりですが次のような考察がなされています。
「UDP を使ってみよう (3)」
http://x68000.q-e-d.net/~68user/net/udp-3.html
受信バッファのあふれではないか?って事みたいです。
ただ、他にも問題が出そうなものですが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に交換できるなら比較的容易に試すことは出来ると思います。
そのUDPはLinuxっぽいですね。史上最悪のデスペナ さんが書きました: そういえばこんなサイト見つけました
513 回目までは正しく送信できているのですが、 514~1623 まではデータがサーバに届いていません。 その後も、89449~97804、97871~98469、98536~100000 は紛失し、結局届いたのは 100,000 分の 3,618。 到達率 3.6%、つまり
データ損失率 96.4%
というものすごいことになっています。
状況的には史上最悪のデスペナさんにそっくりですが次のような考察がなされています。
「UDP を使ってみよう (3)」
http://x68000.q-e-d.net/~68user/net/udp-3.html
受信バッファのあふれではないか?って事みたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
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
結果は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データ損失率
softya(ソフト屋) さんが書きました:受信バッファのあふれではないか?って事みたいです。
送信側の問題かと思ったら確かに受信側の方もありえますね。史上最悪のデスペナ さんが書きました:結論:sendtoの後ある程度の時間を置かないとバッファ(?)が上書きされるなどの状況が発生し、送信が行われなくなることがある。
このPCはリカバリディスク(OS)の付属して無いタイプ(その分安価)なのでインストールは無理ですね・・・・・softya(ソフト屋) さんが書きました:OSを新規インストールするとか同じPCに別OSをインストールして試してみるとか根幹周りの動作確認が不可欠です。
12時間も出来るような時が無いのですが12時間じゃなくてもいいのでしょうか?softya(ソフト屋) さんが書きました:「CPUに意図的に負荷を掛けて不具合が無いかチェックするフリーソフト「Prime95」 | aquapple (archives)」
「パソコン故障を無料ツール「 Ultimate Boot CD 」で検査する」
やってみます。
そういえば、一時期ネットに繋ぐと数時間おきにブルースクリーン&強制再起動になったことがあるのですが・・・・・(スタンドアロンでは起こらず)softya(ソフト屋) さんが書きました:ただ、他にも問題が出そうなものですが
関係ないかもしれませんが一応報告です。
少し前の話ですが、すぐに直ったのでエラーコードはあいまいですが
STOP: 0x0000002E (<parameter>, <parameter>, <parameter>, <parameter>)
DATA_BUS_ERROR
これは Windows NT Executive の文字モード STOP メッセージです。システム メモリ内のパリティ エラーによって引き起こされるデータ バス エラーを示しています。このエラーは、存在しないアドレスにドライバがアクセスした場合にも発生します。
だったような・・・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
リカバリディスク(OS)が付属していなくてもリカバリ方法は提供されているはずです。史上最悪のデスペナ さんが書きました:このPCはリカバリディスク(OS)の付属して無いタイプ(その分安価)なのでインストールは無理ですね・・・・・
考えられるのは別パーティションにリカバリ用のシステムが搭載されているものもあります。
あるいは、リカバリーディスクを作る方法がマニュアルに掲載されているものもあります。
どちらにしてもパソコン付属のマニュアルを確認して下さい。なんらかのリカバリ方法が提供されているはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
リカバリの提供方法→自分でディスクを作ってください
買った当時、何故かディスクが作れずサポートも応答無し。
しばらくして返答があるも、リカバリディスク作成用ディスクを別のメーカーのに買い換えてくれ、という回答
ただでさえディスク使わないのに買うのも嫌だったので結局買わず→今に至る
自業自得といえば自業自得なのですが不具合が出ている今作っても意味が無いのではないかと思えるので・・・・・・・
買った当時、何故かディスクが作れずサポートも応答無し。
しばらくして返答があるも、リカバリディスク作成用ディスクを別のメーカーのに買い換えてくれ、という回答
ただでさえディスク使わないのに買うのも嫌だったので結局買わず→今に至る
自業自得といえば自業自得なのですが不具合が出ている今作っても意味が無いのではないかと思えるので・・・・・・・
手順を印刷しないといけませんが明日にならないと印刷できる環境にならないので明日やる予定ですsoftya(ソフト屋) さんが書きました:「パソコン故障を無料ツール「 Ultimate Boot CD 」で検査する」
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
リカバリ用のイメージは別に保存されているので使える可能性が高いです。
まぁ、CPUやメモリに異常がない場合に限りですが。
ディスクを使わないみたいですが、今まで作ったプログラムやデータはどうやって保存されているんでしょうか?
まぁ、CPUやメモリに異常がない場合に限りですが。
ディスクを使わないみたいですが、今まで作ったプログラムやデータはどうやって保存されているんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
無くなったら絶望するような自作プログラム→覚えてたら(気が向いたら)USBに保存
無くなったらがっかりするけどまあ、諦めれる漫画とかアニメとか小説とか→好きな小説はUSBに保存
その他全て→バックアップ無し
ちなみにUSBは8GB一個だけです。
無くなったらがっかりするけどまあ、諦めれる漫画とかアニメとか小説とか→好きな小説はUSBに保存
その他全て→バックアップ無し
ちなみにUSBは8GB一個だけです。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
なかなかスリリングなバックアップ方法です。
ぜひ、DVD-Rを買ってリカバリディスクの作成をお勧めします。
50枚のスピンドルで買っても1200~1300円ぐらい10枚なら割高ですが500円ぐらいで買えます。
ぜひ、DVD-Rを買ってリカバリディスクの作成をお勧めします。
50枚のスピンドルで買っても1200~1300円ぐらい10枚なら割高ですが500円ぐらいで買えます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
あんまり関係ないかもしれませんけど、バージョンが2.2なのにWSAStartupに2.0を要求して大丈夫なんでしょうか。
WSAStartup(MAKEWORD(2,2), &wsaData);
としてみてらどうでしょう。
何かの見間違いでしたらすみません。
投稿ついでに、自分のノートでも試してみました。
Windows Vista Business SP2 32bit
Celeron 585(2.16GHz)
メモリ 3GB
ウィルス対策ソフト:ウィルスバスター
ファイアウォール:Windowsファイアウォール
とりあえず20回で100%でした。
WSAStartup(MAKEWORD(2,2), &wsaData);
としてみてらどうでしょう。
何かの見間違いでしたらすみません。
投稿ついでに、自分のノートでも試してみました。
Windows Vista Business SP2 32bit
Celeron 585(2.16GHz)
メモリ 3GB
ウィルス対策ソフト:ウィルスバスター
ファイアウォール:Windowsファイアウォール
とりあえず20回で100%でした。
Re: UDPデータ損失率
確かに!梨樹 さんが書きました:あんまり関係ないかもしれませんけど、バージョンが2.2なのにWSAStartupに2.0を要求して大丈夫なんでしょうか。
WSAStartup(MAKEWORD(2,2), &wsaData);
としてみてらどうでしょう。
何かの見間違いでしたらすみません。
・・・・・でも、残念ですが結果は変わりませんでしたorz
完全成功率・・・・・・20%(4回/20回)、不完全成功率・・・・・・5%(1回/20回)
相変わらず、全てのsendtoの後にSleep(1)を入れると100%です
50枚組980円で買ったのがリカバリできません、と言われて残り49枚が使われぬままもうすぐ2年が経ちますね~softya(ソフト屋) さんが書きました:50枚のスピンドルで買っても1200~1300円ぐらい10枚なら割高ですが500円ぐらいで買えます。
DVD-Rだから使い捨てみたいなものだし・・・・・・長期保存するようなの無いですし・・・・・
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
国産メーカーじゃない香りがする値段ですね。まぁ、国産でもたまに失敗しますけど。太陽誘電よりもTDK国産の方が失敗する確率が低い気がしますのでメーカー製を買われたほうが良いと思います。史上最悪のデスペナ さんが書きました:50枚組980円で買ったのがリカバリできません、と言われて残り49枚が使われぬままもうすぐ2年が経ちますね~
DVD-Rだから使い捨てみたいなものだし・・・・・・長期保存するようなの無いですし・・・・・
私の場合VisualStduioExpressのISOイメージ焼いたり、OSのお試し版を焼いて保存しておいたり、ParagonBackupのリカバリ用のイメージを焼いておいたりそれなりに使いますけど・・・。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
それは失敗する利用になりません。史上最悪のデスペナ さんが書きました:そうだ、基本事項が抜けてました。このPCはノートです
本質的な問題ではないので関係ないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
近くに電気店が無いので、売ってるとこに行こうとするとまとまった時間がなかなか取れないんですよね^^;
USB一個じゃ足りないので、安売りしてると欲しいと思うのですが結局行けずに諦めたり・・・・・・
出来るだけ早く対処しなければならないのは分かってるんですが・・・・・・
USB一個じゃ足りないので、安売りしてると欲しいと思うのですが結局行けずに諦めたり・・・・・・
出来るだけ早く対処しなければならないのは分かってるんですが・・・・・・
Re: UDPデータ損失率
Amazonいいですよ.どんなに少額でも配送料無料ですし.配送速いですし.
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: UDPデータ損失率
ディスクを買う方が、突然OSが起動しなくってOSを買うだけのために2万円を出すよりよっぽど良いと思うんですが。史上最悪のデスペナ さんが書きました:近くに電気店が無いので、売ってるとこに行こうとするとまとまった時間がなかなか取れないんですよね^^;
USB一個じゃ足りないので、安売りしてると欲しいと思うのですが結局行けずに諦めたり・・・・・・
出来るだけ早く対処しなければならないのは分かってるんですが・・・・・・
「Amazon.co.jp: Windows 7 Home Premium 通常版 Service Pack 1 適用済み: ソフトウェア」
修理に出しても同じぐらい取られると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: UDPデータ損失率
何故かCDに焼けなかったです・・・・・・softya(ソフト屋) さんが書きました:「パソコン故障を無料ツール「 Ultimate Boot CD 」で検査する」
リカバリディスクは作成できました。
Re: UDPデータ損失率
ISOの焼き方を知らず,ISOファイルを通常のファイルのようにCD-Rに書きこんでいるとかでしょうか.
ISOはCD全体の完全なイメージファイルですので,ISOを普通のファイルと同じ感覚でCD-Rに書きこんでも意味ありません.
CDのライティングソフトに,ISO書き込みモードとか,トラックイメージの書き込みとかいうメニューはありませんか?
ISOはCD全体の完全なイメージファイルですので,ISOを普通のファイルと同じ感覚でCD-Rに書きこんでも意味ありません.
CDのライティングソフトに,ISO書き込みモードとか,トラックイメージの書き込みとかいうメニューはありませんか?