Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 测试udp性能_C++_C_Performance_Sockets_Udp - Fatal编程技术网

C++ 测试udp性能

C++ 测试udp性能,c++,c,performance,sockets,udp,C++,C,Performance,Sockets,Udp,我有Intel Galileo板(“低”性能pc)和与以太网相连的pc(“快”性能)。 我在Galileo上编写了UDP服务器,在PC上编写了UDP客户端。服务器接收UDP数据包,并将它们的数量累加到可变计数中。 代码的一部分: static void recvfrom_int(int); static long count; unsigned long long received = 0; static void recvfrom_int(int signo) { prin

我有Intel Galileo板(“低”性能pc)和与以太网相连的pc(“快”性能)。 我在Galileo上编写了UDP服务器,在PC上编写了UDP客户端。服务器接收UDP数据包,并将它们的数量累加到可变计数中。 代码的一部分:

static void recvfrom_int(int);
static long count;
unsigned long long received = 0;     

static void recvfrom_int(int signo) {
    printf("\nreceived %d datagrams\n", count);
    printf("\nreceived bytes: %d\n", received);
    exit(0);
} 

int main () {  
    signal(SIGINT, recvfrom_int);        
    int sockfd;
    struct sockaddr_in servaddr, cliaddr;    
    char mesg[MAXLINE];        
    ...
    ...
    sockfd = socket (AF_INET, SOCK_DGRAM, 0); 
    ...
    ...
    count = 0;     
    for ( ; ; ) {    
        received += recvfrom(sockfd, mesg, MAXLINE, 0, (struct sockaddr *)&cliaddr, &len);
        count++;        
    }        
}
我有客户端代码,它发送NDG(50000)数据报,每个数据报都有大小DGLEN。 客户部分:

#define MAXLINE 90000
#define NDG 50000 /* datagrams to send */    
#define DGLEN 3100 /* each datagram size */

int main () {
    int sockfd;
    struct sockaddr_in servaddr;
    char sendline[MAXLINE];   
    int i;
    int n = 0;
    ...
    ...
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
    ...
    //SENDING DATAGRAMS
    for (i = 0; i < NDG; i++) {
        n = write(sockfd, sendline, DGLEN);
    }

}
我不明白它的意思。 我认为,DGLEN=1473时的小计数,是因为以太网MTU=1500,并且没有分段的数据报的最大大小是1472(1500以太网MTU-20表示没有选项的IP头-8 UDP头=1472)。使用大小1473,我们获得了碎片,这导致服务器上接收到的数据报数量很少(如果我理解正确的话,maybee在PC上的碎片速度比在Galileo上更快)。 我不明白,为什么用DGLEN=10/50/100/../500计算67,为什么它
然后开始上升(计数=12799 DGLEN=700,计数=49957 DGLEN=1000,等等)

其余数据:

1600 70
2000 72
2100 1125
2200 6021
2300 10404
2500 20370
2800 30046
2900 37729
2944 39052
2950 39610
2952 42907
2953 15540
3000 15587
3100 21373

为什么计数=67?可能与最小以太网数据包大小有关。WireShark:“以太网数据包(报头+用户数据+FCS)小于最小64字节的以太网数据包被填充到64字节,这意味着如果用户数据小于64-(14+4)=46字节,则会向数据包添加额外的填充数据。”当DGLEN=10字节时,填充开始应用,这导致接收端有67个数据报?我的意思是,在快速PC(客户端UDP)上填充速度快,而在Galileo(服务器UDP)上填充速度慢。。但是另一个结果数据呢。。
1600 70
2000 72
2100 1125
2200 6021
2300 10404
2500 20370
2800 30046
2900 37729
2944 39052
2950 39610
2952 42907
2953 15540
3000 15587
3100 21373