の一定のレートbytes
のメッセージを、UDPを介して任意のチャネル(チャネルがそのレートをサポートしていると仮定)にargs.rate
ビット/秒で送信する予定です。そこにそれを行うには良い方法はおそらくだが、私は、これは動作するはずと信じて:完了酒hereについてはUDPメッセージを数Kbit/sの一定速度で送信するプログラムで、3Mbit/sで送信しますか?
double interval = (double)(bytes * 8)/(double)args.rate;
struct timespec s, e;
if (clock_gettime(CLOCK_REALTIME, &s) == -1)
REPORT_AND_EXIT;
while(true) {
ssize_t rc = sendto(sockfd, args.msg, bytes, 0, (struct sockaddr *)(&peer),
(socklen_t)sizeof(peer));
if (rc == -1)
REPORT_AND_EXIT;
do {
clock_gettime(CLOCK_REALTIME, &e);
} while (ELAPSED(s, e) < interval);
s = e;
}
は、コード全体(受信機と送信機の両方)です。
、args.rate = 638000
で、iftopとnload(2つのネットワーク監視アプリケーション)の両方が638Kbit/sを期待していたのに対し、3Mbpsの一定速度を示します。私は自分のプログラムに何が間違っているのか分からなかったので、何が起こっているかを見るためにtcpdumpを使いました。その結果を誤解していない限り、ちょうど13286 6バイトのUDPパケットが送られて637728ビットまたは637.728 Kbit/sと予想されていました。だから、なぜ私は3Mbit/sを表示しているのですか?私はiftopとtcpdumpの両方を監視するように設定しましたが、何も実行していませんでした(tcpdumpは自分のアプリケーションから来なかった単一のICMP要求を取得しましたが、無視してください)。
Hereはtcpdump -ttt -i lo
の出力であり、以下の(cut -d' ' -f1 log | cut -d'.' -f2 | sed 's/^/0./ >log2
後)1秒後に送信されたビット数のログから算出Rスクリプトである
library(dplyr)
df <- read.csv("log2", header=F)
names(df) <- c("time")
df %>%
mutate(cum=cumsum(time), ct=as.numeric(row(df)), bytes=6*ct, bits=8*bytes, kbits=bits/1000) %>%
filter(cum >= 1.0 - 1e-4) %>%
head
結果:
time cum ct bytes bits kbits
7.5e-05 0.999931 13285 79710 637680 637.680
7.5e-05 1.000006 13286 79716 637728 637.728
7.6e-05 1.000082 13287 79722 637776 637.776
7.5e-05 1.000157 13288 79728 637824 637.824
7.5e-05 1.000232 13289 79734 637872 637.872
7.5e-05 1.000307 13290 79740 637920 637.920
ハード・タイム・チェック・ループでCPUをスモークさせるのではなく、次の必要な間隔でスリープ状態にする必要があります。 – EJP