UDP服务器
协议数据传输
传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议。TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输。但UDP也是网络通信中不可或缺的重要通信手段。
相较于TCP而言,UDP通信的形式更像是发短信。不需要在数据传输之前建立、维护连接。只专心获取数据就好。省去了三次握手的过程,通信速度可以大大提高,但与之伴随的通信的稳定性和正确率便得不到保证。因此,我们称UDP为“无连接的不可靠报文传递”。
那么与我们熟知的TCP相比,UDP有哪些优点和不足呢?由于无需创建连接,所以UDP开销较小,数据传输速度快,实时性较强。多用于对实时性要求较高的通信场合,如视频会议、电话会议等。但随之也伴随着数据传输不可靠,传输数据的正确率、传输顺序和流量都得不到控制和保证。所以,通常情况下,使用UDP协议进行数据传输,为保证数据的正确性,我们需要在应用层添加辅助校验协议来弥补UDP的不足,以达到数据可靠传输的目的。
与TCP类似的,UDP也有可能出现缓冲区被填满后,再接收数据时丢包的现象。由于它没有TCP滑动窗口的机制,通常采用如下两种方法解决:
1)服务器应用层设计流量控制,控制发送数据速度。
2)借助setsockopt函数改变接收缓冲区大小。如:
#includeintsetsockopt;intn=220x1024setsockopt);
C/S模型-UDP
由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,保证通讯可靠性的机制需要在应用层实现。
编译运行server,在两个终端里各开一个client与server交互,看看server是否具有并发服务的能力。用Ctrl+C关闭server,然后再运行server,看此时client还能否和server联系上。和前面TCP程序的运行结果相比较,体会无连接的含义。
server
#include#include#include#include#include#include #include #defineMAXLINE80#defineSERV_PORT6666intmain{structsockaddr_inservaddr,cliaddr;socklen_tcliaddr_len;intsockfd;charbufMAXLINE;charstrINET_ADDRSTRLEN;inti,n;sockfd=socket;bzero);servaddr.sin_family=AF_INET;servaddr.sin_addr.s_addr=htonl;servaddr.sin_port=htons;bind&servaddr,sizeof);printf;while{cliaddr_len=sizeof;n=recvfrom&cliaddr,&cliaddr_len);ifperror;printf),ntohs);forbufi=toupper;n=sendto&cliaddr,sizeof);ifperror;}close;return0;}
client
#include#include#include#include#include #include#include #defineMAXLINE80#defineSERV_PORT6666intmain{structsockaddr_inservaddr;intsockfd,n;charbufMAXLINE;sockfd=socket;bzero);servaddr.sin_family=AF_INET;inet_pton;servaddr.sin_port=htons;while!=NULL){n=sendto,0,&servaddr,sizeof);ifperror;n=recvfrom;ifperror;write;}close;return0;}
运行结果:
Tags:协议数据传输,UDP服务器
版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。