现在我们查看无任何流量控制的UDP对数据报传输的影响。首先我们把dg_cli函数修改为发送固定数目的数据报,并不再从标准输入读。如下,它写2000个1400字节大小的UDP数据报给服务器。

客户端程序cli.c:

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>#define SERV_PORT 3333
#define MAXLINE 1024
#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \} while(0)typedef struct sockaddr SA;
#define NDG     2000    /* datagrams to send */
#define DGLEN   1400    /* length of each datagram */void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
{int        i;char  sendline[DGLEN];for (i = 0; i < NDG; i++) {sendto(sockfd, sendline, DGLEN, 0, pservaddr, servlen);}
}int main(int argc, char **argv)
{int                    sockfd;struct sockaddr_in   servaddr;if (argc != 2)ERR_EXIT("usage: udpcli <IPaddress>");bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, argv[1], &servaddr.sin_addr);sockfd = socket(AF_INET, SOCK_DGRAM, 0);dg_cli(stdin, sockfd, (SA *) &servaddr, sizeof(servaddr));exit(0);
}

然后,我们把服务器程序修改为接受数据报并对其计数,并不再把数据报回射给客户。如下为新的dg_echo函数。当我们用终端中断键终止服务器时(相当于向它发送SIGINT信号),服务器会显示所接收到数据报的数目并终止。

服务器程序serv.c:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<string.h>
#include <signal.h>#define SERV_PORT 3333
#define MAXLINE 1024#define ERR_EXIT(m) \do { \perror(m); \exit(EXIT_FAILURE); \} while (0)typedef struct sockaddr SA;
static void recvfrom_int(int);
static int  count;void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{socklen_t  len;char        mesg[MAXLINE];signal(SIGINT, recvfrom_int);for ( ; ; ) {len = clilen;recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);count++;}
}static void recvfrom_int(int signo)
{printf("\nreceived %d datagrams\n", count);exit(0);
}int main(int argc, char **argv)
{int                    sockfd;struct sockaddr_in   servaddr, cliaddr;sockfd = socket(AF_INET, SOCK_DGRAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family      = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port        = htons(SERV_PORT);bind(sockfd, (SA *) &servaddr, sizeof(servaddr));dg_echo(sockfd, (SA *) &cliaddr, sizeof(cliaddr));
}

如果客户端运行在快速的主机,服务器运行在慢速的主机,一般会出现丢包现象。

UDP套接字接收缓冲区

由UDP给某个特定套接字排队的UDP数据报数目受限于该套接字接收缓冲区的大小。我们可以使用SO_RCVBUF套接字选项修改该值。

修改服务器程序serv.c的函数dg_echo:

static void   recvfrom_int(int);
static int  count;void
dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen)
{int            n;socklen_t len;char        mesg[MAXLINE];signal(SIGINT, recvfrom_int);n = 220 * 1024;setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));for ( ; ; ) {len = clilen;recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);count++;}
}static void
recvfrom_int(int signo)
{printf("\nreceived %d datagrams\n", count);exit(0);
}

转载于:https://www.cnblogs.com/wangfengju/p/6172562.html

UNIX网络编程——UDP缺乏流量控制(改进版)相关推荐

  1. UNIX网络编程——UDP回射服务器程序(初级版本)以及漏洞分析

    该函数提供的是一个迭代服务器,而不是像TCP服务器那样可以提供一个并发服务器.其中没有对fork的调用,因此单个服务器进程就得处理所有客户.一般来说,大多数TCP服务器是并发的,而大多数UDP服务器是 ...

  2. unix网络编程之简介和运输层TCP/UDP

    前言:本文只介绍了有关UNIX网络编程的理论知识,具体的应用和例子在稍后的博文中将更新 第一章  简介 一个简单的服务器程序步骤: 说明:1.创建TCP套接口 2.捆绑服务器的众所周知端口 3.把套接 ...

  3. 《UNIX网络编程 卷1:套接字联网API(第3版)》——第2章 传输层:TCP、UDP和SCTP 2.1概述...

    本节书摘来自异步社区<UNIX网络编程 卷1:套接字联网API(第3版)>一书中的第2章,第2.1节,作者:[美]W. Richard Stevens , Bill Fenner , An ...

  4. 网编编程必看书籍:unix网络编程

    unix网络编程被誉为圣经,该书主要讲socket套接字相关,socket API,从底层剖析网络编程.网络编程中需要用到的一些经典函数,多路复用函数,这些都值得去反复学习研究. 目录: 录 Part ...

  5. Unix网络编程卷一第三章笔记

    前言 这篇文章主要是Unix网络编程卷一第三章的个人笔记 1.POSIX 规范的三个字段 sin_family sin_addr sin_port 2.IPV4 套接字结构 五个套接字结构 IPV4( ...

  6. 再读Socket编程——《UNIX网络编程(卷一)》学习点滴

    原先曾以Socket编程为入口开始自己的新的学习,毕竟未曾致用,时至今日已比较生疏.借着阅读<UNIX网络编程(卷一)>(简称UNPv1)的机会,正好复习一番,而且希望将新的感受记录下来. ...

  7. UNIX网络编程—SCTP编译运行错误及解决

    UNIX网络编程-SCTP编译运行错误及解决 环境 ubuntu 14.04 64bits unpv13e 问题1 'redefinition of 'struct in_pktinfo' 解决办法1 ...

  8. UNIX网络编程---套接字编程简介(三)

    UNIX网络编程---套接字编程简介 一.概述 从这里开始正式开始网络编程之旅,所有的函数都是基本的库函数.这些都是网络编程的基础.Come on!!!! 二.套接字地址结构 大多数套接字函数都需要一 ...

  9. UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stevens经典著作,两位顶级网络编程专家应邀执笔修订)...

    UNIX网络编程.卷1,套接字联网API(第3版)(中文版)(Stevens经典著作,两位顶级网络编程专家应邀执笔修订) 基本信息 原书名: Unix Network Programming, Vol ...

最新文章

  1. mysql clomn_mysql 备份脚本
  2. barrier linux,Linux系统上启用barrier?
  3. 【Java 集合】Java 集合主要脉络 ( Collection | Map | List | Set )
  4. jQuery 里面的排他思想
  5. 微软如何利用机器学习改进Win 10更新体验
  6. php微信模板信息发送的代码例子,微信模板消息发送样例
  7. WebFlux响应式编程基础之 2 函数式编程 工具jclasslib bytecode viewer
  8. C语言实现字符串转整型
  9. linux命令 三大利器,awk、grep、sed是linux操作文本的三大利器,也是必须掌握的linux命令之一...
  10. Android签名打包详解
  11. WDS+ADK+MDT 部署轻触式系统安装(1)《准备》
  12. 找到一个好用的在线创意英文logo设计生成器网站
  13. 用Python学《微积分B》(微积分应用)
  14. 银联支付接口申请流程-傲付宝
  15. tortoise git revert的坑
  16. 事事有着落,件件有回音——MyAppsp平台督查督办管理系统
  17. 浙江省计算机英语等级考试,2020年上半年浙江省高校计算机等级考试报名(浙江外国语...
  18. 这个英文语法校正插件很赞!可以校正邮件,也可以校正论文
  19. 车联网中密码技术的探究
  20. 永磁同步电机矢量控制中的双闭环是什么意思_STM32 TALK | 无感FOC方案原理机器控制难点分析...

热门文章

  1. 【自用】 sklearn 用 train_test_split 简单划分训练和测试集
  2. 加/减数组中的值得到指定的和 Target Sum
  3. MaxScale Binlog Server
  4. 【原创】.NET读写Excel工具Spire.Xls使用(4)对数据操作与控制
  5. 上传照片表单提交包括文本框下拉条等,如何取文本框的值
  6. 05-VTK在图像处理中的应用(2)
  7. Javascript_初学第1天
  8. CKO将成为企业发展的军师--转自世界名人网
  9. 【转载】如何学JavaScript?前辈的经验之谈
  10. ACCP8.0Y2Web前端框架与移动应用开发第5章Bootstrap制作微票儿首页