【问题标题】:calculate time to receive/send data inorder to calculate bandwidth计算接收/发送数据的时间以计算带宽
【发布时间】:2013-11-29 16:04:24
【问题描述】:

我有一个数据包嗅探器(见下文)。为了测量带宽,我想我需要在接收数据开始时启动一个计时器。记录已传输的字节数,然后计算平均带宽。为了测量接收/发送数据的时间,我做了:

int main() {
    //usual packet sniffer staff up untill while loop
    struct pcap_pkthdr header;
    const unsigned char *packet;
    char errbuf[PCAP_ERRBUF_SIZE];

    char *device;
    pcap_t *pcap_handle;

    int i;
    device = pcap_lookupdev(errbuf);
    if (device == NULL) perror("pcap_lookupdev failed");

    printf("Sniffing on device %s\n", device);

    pcap_handle = pcap_open_live(device, 4096, 1, 0, errbuf);
    if (pcap_handle == NULL) perror("pcap_open_live failed");   

    while (1) {
            //starting the timer
        double diff = 0.0;
        time_t start;
        time_t stop;
        char buff[128];
        time(&start);

            //receiving packet
        packet = pcap_next(pcap_handle, &header);

            //stopping the timer
        time(&stop);

             //measuring time of receiving data
        diff = difftime(stop, start);

        process_packet(packet, header.len, diff);
    }

}

diff 结果总是 0.0000,这可能是错误的。我的理解是否正确,如果是,代码有问题吗?

我也尝试使用毫秒:

float diff;
clock_t start;
clock_t stop;
char buff[128];
start = clock();   

packet = pcap_next(pcap_handle, &header);//just creates a pointer in no time

stop = clock();
diff = (((float)stop - (float)start) / 1000000.0F ) * 1000;  

同样的输出...

【问题讨论】:

    标签: c time network-programming packet bandwidth


    【解决方案1】:

    样本数量不足或时钟太粗。

    开始和停止之间的数据包数量可能太少了。 time_t 通常只有 1 秒的分辨率。 clock_t 具有实现定义的每秒滴答数 CLOCKS_PER_SEC。我见过 18.2 或 100 或 1000 等值。它也可能不足以容纳 1 个数据包。

    建议将传输字节的时间至少增加到时钟周期的 10 倍。因此,如果您使用 time_t 并以 19,200 波特率运行,则传输 192,000 字节。

    为了保持一致性,同步开始时间会有所帮助。下面的示例适用于 clock_t,只需相应缩放即可。

    // sync
    time_t was;
    time(&was);
    time_t now;
    do {
      time(&now);
    } while (now == was);
    
    // do test
    do_test();  // about 10 seconds;
    
    // results
    time_t later;
    time(&later);
    time_t delta = late - now;
    BitsPerDataByte = 1+8+1;
    double TestedBaud = 1.0*DataBytesSent*BitsPerDataByte/delta;
    

    【讨论】:

    • 我无法控制传输的字节数...我必须计算收到的每个数据包的带宽并计算平均带宽...
    • 我使用了以下有效的代码:stackoverflow.com/questions/8558625/…。但是我尝试测量它的方式你认为是对的吗?
    • @maximilliano 您的帖子暗示使用clock_t 失败,但您的评论暗示它有效。我不认为你的方法是正确的。您需要测量数据包何时开始到达以及何时完成。不是调用可能已经接收到的数据包等待的例程需要多长时间。也许是一个新的范例:每次接收到一个数据包时记录时间(clock_t)并报告两个数据包之间的差异。顺便说一句:使用 CLOCKS_PER_SEC,而不是 1000000.0F。
    • @maximilliano 平均,你是指最后N个数据包的运行平均值,最近结果的运行平均值还是报告一次平均值?
    • 动态平均所有结果。所以对于第一个数据包它只是数据包的带宽,对于第二个数据包它是第一个和第二个的平均值,等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多