Linux:UDP接收消息比发送的慢

时间:2015-01-29 08:08:12

标签: c linux sockets udp

我正在使用基于arm-cpu的板,使用内核Linux版本2.6.12.3-a9-17运行uclinux,以使用UDP协议通过任一网络从PC接收数据。

我的问题是,虽然我可以接收所有消息(没有丢失),但是传入消息之间的时间间隔最多限制为20毫秒。也就是说,如果我每隔30ms发出一次消息,一切都OK。但是,如果我每隔10ms发送一次消息,则该板每20ms显示一次传入的UDP包(因此,它将花费两倍于PC用于接收所有消息的时间)。

我正在使用这些代码来衡量两个传入消息之间的时间间隔:

struct timeval tnew, told, dt;
gettimeofday(&tnew,0);
told = tnew;

while (1) {
    memset(buf, 100, 0);
    int recvlen = recvfrom(fd, buf, 100 , 0,
                           (struct sockaddr *)&addr_recv, &addr_len);
    if (recvlen>0) {
        gettimeofday(&tnew ,0);
        timersub(&tnew,&told,&dt);
        told = tnew;
        printf("UDP intput: %fms, string:%s\n", (float)dt.tv_usec / 1000.0,buf);
    }

结果如下:

在PC上:

UDP output: 10.019000ms, string: 353:ABCDEFG
UDP output: 10.067000ms, string: 354:ABCDEFG
UDP output: 10.068000ms, string: 355:ABCDEFG
UDP output: 10.068000ms, string: 356:ABCDEFG
UDP output: 10.004000ms, string: 357:ABCDEFG
UDP output: 10.120000ms, string: 358:ABCDEFG

在船上:

UDP intput: 20.000000ms, string: 353:ABCDEFG, 
UDP intput: 20.002000ms, string: 354:ABCDEFG, 
UDP intput: 19.998000ms, string: 355:ABCDEFG, 
UDP intput: 20.051000ms, string: 356:ABCDEFG, 
UDP intput: 19.953000ms, string: 357:ABCDEFG, 
UDP intput: 19.996000ms, string: 358:ABCDEFG, 

我认为这个间隔应该由linux系统中的某些东西定义。我该如何解决?

顺便说一句,董事会的iptables显示(EXT = eth0):

 iptables -A INPUT -i $EXT -p udp -d 0/0 --dport 1024:65535 -j ACCEPT

非常感谢。

1 个答案:

答案 0 :(得分:0)

谢谢你的回复。我发现问题是由于usleep(10)和while结束。在主板上,usleep(10)需要20ms,而在另一台PC上需要0.1ms。