2017-06-05 4 views
0

の一定のレート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要求を取得しましたが、無視してください)。

Heretcpdump -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 
+1

ハード・タイム・チェック・ループでCPUをスモークさせるのではなく、次の必要な間隔でスリープ状態にする必要があります。 – EJP

答えて

1

監視アプリケーションは、実際のネットワークトラフィック(UDPオーバーヘッドを含む)を表示します。

IPヘッダーは20バイトで、UDPヘッダーは8バイトで合計28バイトのオーバーヘッドです。送信する6バイトのパケットは、実際のサイズで34バイトです。

これらの13,286パケットは、451,724バイト、つまり3,613,792ビットです。これはあなたが見る3Mビットに近いです。

IPより下のオーバーヘッドは、IP接続に関係なく、ネットワークパス上で一定ではないため(たとえば、モデムを通過するときに変更される可能性があるため)、IPモニタリングでカウントされません。

+1

"_ IPヘッダーは12バイトです..." IPv4ヘッダーは、少なくとも20バイトで、IPv4オプションまたはペイロードは除きます。 6バイトのUDPデータグラムでは、最小パケットサイズは34バイトになります。これには、レイヤ2プロトコルのオーバーヘッドは含まれていません。イーサネットの場合、最低でも18バイトです。 –

+0

@RonMaupin私の悪い、私は何かが行方不明だった感じを持っていた... – ElderBug

関連する問題