服务器程序有效代码片段
#include "unp.h"
#include <stdio.h>
static int counter;
static void recvfrom_int(int signo)
{
fprintf(stdout, "\nreceived %d datagrams\n", counter);
exit(0);
}
void dg_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
counter = 0;
socklen_t len;
char buf[MAXLINE];
Signal(SIGINT, recvfrom_int);
for(;;){
len = clilen;
n = Recvfrom(sockfd, buf, MAXLINE, 0, pcliaddr, &len);
Sendto(sockfd, buf, n, 0, pcliaddr, len);
usleep(1);
counter++;
}
}
客户端程序有效代码片段
#include "unp.h"
const int NUM = 2000;
const int DGRAM_LEN = 1400;
void do_cli(FILE *fp, int sockfd,
const struct sockaddr *pservaddr, socklen_t servlen)
{
int n;
char buf[MAXLINE];
int i = 0;
for(i = 0; i < NUM; ++i){
Sendto(sockfd, buf, DGRAM_LEN, 0, pservaddr, servlen);
}
}
试验假想:
1.因为本机是在同一台主机上面运行的程序所以我们需要,通过调用usleep()函数来模拟,服务器端程序在低速主机上面运行。
2.客服户成发送2000个大小为1400字节的UDP数据报给服务器,然后通过回射处理发回。
3.通过服务器程序中counter计数来表明服务器接收到的UDP数据报个数。
运行结果如下:
实验结果:接受到了402个数据报,那个造成了数据报丢失率为80%
结果多次试验结果下图:
服务器接受的数据报的数目不确定性分析:
1、网络负载。
2、客户机处理负载。
3、服务器主机处理负载。
针对数据问题解决方案:
增大套接字缓冲区大小
通过调用setsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen)
服务器端口程序:
#include "unp.h"
#include <stdio.h>
static int counter;
static void recvfrom_int(int signo)
{
fprintf(stdout, "\nreceived %d datagrams\n", counter);
exit(0);
}
void dg_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
int bufsize = 2000 * 1500;
int flag = setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize));
if(flag == 0 ) printf("set up successfully\n");
counter = 0;
socklen_t len;
char buf[MAXLINE];
Signal(SIGINT, recvfrom_int);
for(;;){
len = clilen;
n = Recvfrom(sockfd, buf, MAXLINE, 0, pcliaddr, &len);
Sendto(sockfd, buf, n, 0, pcliaddr, len);
usleep(1);
counter++;
}
}
运行结果:
综合以上结果分析,将UDP的接受缓冲区改大对试验结果改善程度不是很明显。