TCPでスループットを測定するプログラムを作っています。
データの受信を終了するには、送信側がソケットをクローズして、
受信側のread()メソッドが-1を返すのが主流だと考えていますが、
私のプログラムでは、受信した後に受信側から送信側へデータを返信したいため、
ソケットをクローズすることで受信終了というようにしたくないです。
また、受信したバイト数をread(buf,int,int)の戻り値で取得したいです。
私が考えている方法としては、送信側で「finish」というメッセージを送信したら、
受信側で受信を終了させようと考えました。
read(buf,int,int)はbufに受信したバイトを格納すると思います。格納されたバイトの最後から6個を確認させ、
finishならば受信終了にすればよいと考えました。
送信側のコードは下のようにしました。
String signal = "finish";
byte[] signal_buf = signal.getBytes();
send_start = System.nanoTime();
for (int i = 0; i < Data-6; i++) {
try {
out.write(i);
out.flush();
} catch (IOException e) {
System.err.println(e);
}
}
out.write(signal_buf);
out.flush();
send_stop = System.nanoTime();
System.out.println("送信完了");
受信側は、finishを読み込んだらループを抜けるようにしたいです。
recv_start = System.nanoTime();
for(;;){
part = in.read(buf);
if(part > 0)
total += part;
if(finishを読み込んだら){
break;
}
}
recv_stop = System.nanoTime();
どのようにしてfinishを読み込んだことを認識させれば良いでしょうか?
・合図となるメッセージにより受信を終了すること、
・read(buf,int,int)の戻り値で読み込んだバイト数を取得すること、
この2点を絶対に削りたくないのです。
どうすればよいか、アドバイスをいただけないでしょうか?
No.2ベストアンサー
- 回答日時:
UDPは非常に信頼性の低いプロトコルですので、TCPの場合と同様の電文を送受信しても期待したデータを確実に受け取れる保障はありません。
UDPでは、
・connectに成功しても、相手プロセス(受信側ポート)が存在しているかどうかは不明
・受信バッファが足りなかった場合に、パケットが破棄されて、エラーかどうかの判別もつかない
・一部パケットをネットワーク上で失っても、分からないことがある
のようなことが当然のように発生します。
ですのでUDPでは、(たとえば単なる通知メッセージなどのように)失っても処理に影響を与えないようなもののみを送受信するようにして、
しっかりと送受信したいデータはTCPで送受信するべきだと思います。
性能測定の場合、受信したデータグラムの受信サイズと受信時刻とかをprintするようにして、その時間間隔とサイズを見るぐらいでしょうか。いずれにしても、あまり確実な計測方法は期待しないほうがいいと思います。
回答ありがとうございます。
送信データをUDPで送信した後、TCPで受信終了させる合図を
送信するという仕組みにしたところ、うまくできました。
アドバイスをしていただき、ありがとうございました。
また、分からないところがあれば質問させていただきますので
よろしくお願いします。
No.1
- 回答日時:
このままだと最後の"finish"が一回のreadで取得されかった場合に、終了の判定ができいことが発生します。
小さいデータサイズであれば、たいてい一回のreadで全部取得できることが多いのですが、しかしその保障はありません。
"finish"を送る直前にflushすると、"finish"は一回で受信できる可能性はそれなりに高まりますが、間にレイヤ3ハブなどが入ったりすると、やはり保障はありません。
アプリケーションレベルの電文形式を決めて、送受信するのが一般的でしょう。
たとえば、
データ電文 = コマンド("DAT") + データ長 + データ
終了電文 = コマンド("FIN")
終了応答電文 = コマンド("ACK")
などと決めておいて、
・送信側
1.データ電文送信
2.終了電文送信
3.コマンド(終了応答電文)のデータサイズ分(例えば3byte)に達するまで繰り返し受信
・受信側
1.コマンドのデータサイズ分(例えば3byte)に達するまで繰り返し受信
2.データ電文の場合には、
2-1.データ長をデータ長サイズ分(例えば4byte)に達するまで繰り返し受信
2-2.データをデータ長分に達するまで繰り返し受信
3.終了電文の場合には、終了応答電文を送信して、プログラムを終了する
というふうにすれば、確実に終了電文を判定できるでしょう。
終了電文での終了か、切断での終了かをprintしておけば、なお確実に確認できます。
また、データ電文を一定サイズに分割送信してみたり、分割サイズを変えてみたりして、性能にどのような影響がでないのか?でるのか?、また、ネットワーク構成をかえるとどうか?、何でそうなるのか?などを探ってみるともっと面白い性能テストができるかもしれませんね。
回答ありがとうございます。
TCPとUDPのプログラムを作っています。TCPの方はアドバイスをしていただいたおかげで完成しました。
UDPがうまくできません。UDPもおなじようにやればよいのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- その他(メールソフト・メールサービス) Windows10付属のメール、なぜ設定が劇的に簡単になったのか? 1 2022/12/16 13:14
- その他(メールソフト・メールサービス) サンダーバードでメールが受信されない 10 2022/03/24 17:00
- Outlook(アウトルック) 未読ならば受信トレイから削除する 2 2023/02/12 19:21
- 確定申告 青色確定はいつの税金から控除が利用できますか? 2 2022/07/24 11:41
- Gmail 【お助け!】サーバーからのメール送信でGmailに送信されない問題について 1 2023/06/20 22:03
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- クレジットカード ユーペイのクレジット決済について詳しい方教えてください。 これまで7年間バイトをしてきて初めて不思議 1 2022/07/23 16:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソケット通信 同じポート番号...
-
TCP/IP通信時のサーバーからの受信
-
VB6のwinsockでconnectできない
-
UDP通信におけるbind関数について
-
エクセル VBA でのCOMポート...
-
TCP/IP通信型プログラムです。 ...
-
WINSOCKのWSACleanupについて
-
ソケットを用いた1対多通信につ...
-
WIN32API CreateFileのCOMx
-
Socketの使用方法について
-
UDP通信する時に、相手にどうや...
-
どうか、POSTでのファイル転送...
-
TCP/IP通信でのコネクシ...
-
ソケットのrecvの戻り値が0
-
非ブロッキングソケットのrecv...
-
CreateFile関数でCOMポートが開...
-
JAVAでソケット通信(クライア...
-
ソケットのクローズについて
-
Linuxでsocket接続をしているの...
-
WinSockでの通信プログラムがう...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
VB6のwinsockでconnectできない
-
UDP通信する時に、相手にどうや...
-
ソケットのクローズについて
-
エクセル VBA でのCOMポート...
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
Socket通信の0バイト受信について
-
WinSockでの通信プログラムがう...
-
同じLAN内パソコンのIPアドレス...
-
ソケット通信 同じポート番号...
-
VC++でのソケット通信について
-
Connectエラーが出てしまう・・...
-
CreateFile関数でCOMポートが開...
-
VB6‥ソケットについて
-
Winsockを使わずにVBでSocketを...
-
SIPがNATを越えられない理由
おすすめ情報