C++ 测试udp性能
我有Intel Galileo板(“低”性能pc)和与以太网相连的pc(“快”性能)。 我在Galileo上编写了UDP服务器,在PC上编写了UDP客户端。服务器接收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
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