UDP的流量控制和数据报丢失问题试验分析

服务器程序有效代码片段

#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的接受缓冲区改大对试验结果改善程度不是很明显。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值