UDPで帯域測定プログラムを作りました。
このプログラムは、送信側で10000個のパケットを送信して、
受信側でスループット、パケット到達率、パケット到達間隔を測定するものです。
このプログラムに送信側で送信レートという機能を追加したいのです。
送信レートは、1秒間に何バイトのパケットを何個送ったかというものですよね?
私は1秒間に100個のパケットを送信しようと考えています。
私が考えたのは、100個のパケットを送る処理と一緒に、無駄なループを追加するということです。
こうすることで無駄なループで時間を稼ぐことができます。1秒に近づくようにループを調節すればよいと考えました。
時間を稼ぐためのループを作りたいのですが、ループの中はどう書いたらよいでしょうか?
また、ほかに良い方法があれば、アドバイスをいただきたいです。
No.1
- 回答日時:
「無駄なループ」はやめましょう。
それこそ、無駄にCPUパワーを消費していまいます。それよりも、Sleep を使ってください。
http://msugai.fc2web.com/java/thread/sleep.html
回答ありがとうございます。
私の作ったプログラムは、紹介していただいたサイトのプログラムのようにスレッド化していません。
ですから、スリープはできないと思うのですが、どうすればよいでしょうか?
私の作ったプログラムを載せます。ご指導していただければ幸いです。
import java.net.*;
import java.io.*;
public class UDPSpeedClient {
public static void main(String[] args) throws IOException {
final int BUF_MAX = 500;
if (args.length != 2)
throw new IllegalArgumentException("Parameter(s):<Server><Port>");
InetAddress host = InetAddress.getByName(args[0]);
int port = Integer.parseInt(args[1]);
long send_start;
long send_stop;
int send_total = 0;
byte[] send_buf = new byte[BUF_MAX];
DatagramSocket socket = new DatagramSocket();
send_start = System.nanoTime();
System.out.println("送信開始");
for(int i = 0;i<100;i++){
DatagramPacket sendPacket = new DatagramPacket(send_buf,BUF_MAX,host,port);
send_total += BUF_MAX;
try{
socket.send(sendPacket);
for(;;){
// ここで時間を稼ごうとしています。
break;
}
}catch(IOException e){
System.out.println(e);
}
}
send_stop = System.nanoTime();
System.out.println("送信完了");
//結果表示
socket.close();
}
}
No.2ベストアンサー
- 回答日時:
> 私の作ったプログラムは、紹介していただいたサイトのプログラムのようにスレッド化していません。
> ですから、スリープはできないと思うのですが、どうすればよいでしょうか?
マルチスレッド化していなくても、メインのスレッドは1本走っています。
http://d.hatena.ne.jp/konchi/20090911/1252646115
あとは「i回目のsleep終了予定時刻」は「送信開始から(i+1)×10ミリ秒後」になるので、それと、sleep開始時刻との差が、sleepすべき時間になります。
ですから、socket.send の次に
Thread.sleep((i+1)*10-(System.nanoTime()-send_start)/1000000);
を入れることでいけると思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- docomo(ドコモ) ドコモの114サービスで、パケット通信中となるのは 電話の時以外もありますか? 先日主人の携帯を調べ 2 2022/12/08 11:28
- UNIX・Linux Ubuntuサーバーでメールを受信できない 7 2022/08/23 20:55
- その他(セキュリティ) これはDos攻撃になりますか? 1 2022/06/30 09:46
- その他(メールソフト・メールサービス) 複数のメールを送信した順と受信した順が違うのは何故? 4 2023/02/22 09:58
- メルカリ らくらくメルカリ便 スマホを送った 箱が3 cm 以上ありました ゆうパケットではだめ? 1 2023/02/08 23:32
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- その他(ネットショッピング・通販・ECサイト) 通販サイトで購入した商品を返品したい。 4 2022/07/21 19:23
- ダイヤルアップ Raspberry Piでアナログモデム経由で音声再生 1 2022/05/20 18:01
- ネットワーク 通信量を見たい 3 2023/03/01 07:47
- ヤフオク! ヤフオクとペイペイフリマの同時出品時の配送方法について 1 2022/12/29 15:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでの一時停止と再開の方法
-
プログラミングについて。 1つ...
-
画面を強制的に再描画させる方法
-
どなたかこのプログラミングを...
-
Javaでゲーム
-
イベントの発生を待つ
-
テキストボックスの名前に変数...
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
モンテカルロ法
-
VBAで3秒だけ時間を止めたい
-
エクセルの当番表を作っていま...
-
多重ループの抜けだし方
-
VBA Dir関数でファイルをループ...
-
StatementとResultSetのclose()...
-
vb.netからエクセル関数書き込み
-
Escキーを押すと、中断する時と...
-
Excel vba でコンボボックスの...
-
イテレータの存在意義
-
VBA横データを縦にしたいです
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
画面を強制的に再描画させる方法
-
VBAで3秒だけ時間を止めたい
-
VBAでの一時停止と再開の方法
-
どなたかこのプログラミングを...
-
Escキーを押すと、中断する時と...
-
UWSCの終了の仕方
-
エクセルの当番表を作っていま...
-
VBA for i=1 to lastrow
-
「偶数・奇数の和」のフローチ...
-
アクティブセルから、A列最終行...
-
DoEventsが必要な理由について
-
vb.netからエクセル関数書き込み
-
GIFアニメをループさせたくない
-
DOSコマンドのループ内のTIMEコ...
-
範囲指定したセルを1つずつ飛...
-
流れ図(フローチャート)が分か...
-
乱数の桁数指定、または範囲指定。
-
テキストボックスの名前に変数...
-
CSVファイルの特定の行だけを読...
-
vb.netです。2次元配列の要素を...
おすすめ情報