嵌入式linux的网络编程(4)--UDP Server程序设计_求佛_ce123的博客-程序员宅基地

技术标签: linux网络编程  

嵌入式linux的网络编程(4)--UDP Server程序设计

CSDN2013年度博客之星评选活动开始,本人有幸入围参加评选,如果博客中的文章对你有所帮助,请为 ce123 投上宝贵一票,非常感谢!
投票地址:http://vote.blog.csdn.net/blogstaritem/blogstar2013/ce123

前面介绍了基于TCP的通信程序的设计,TCP协议实现了连接的,可靠的,传输数据流的传输控制协议,而UDP是非连接的,不可靠的,传递数据报的传输协议.由于UDP不提供可靠性保证,使得具有较少的传输时延,因而UDP协议常常用在一些对速度要求较高的场合.

1.UDP的通信过程

UDP通信的基本过程如下:在服务器端,服务器首先创建一个UDP数据报类型的套接字,该socket的类型为SOCK_DGRAM;然后服务器端调用bind函数,给比UDP套接字绑定一个端口.由于不需要建立连接,因此服务器端就可以通过调用recvfrom函数在指定的端口等待客户端发送来的UDP数据报.在客户端,同样要先通过socket函数创建一个数据报套接字,然后由操作系统为这个套接字分配端口号.此后客户端就可以使用sendto函数向一个地址发送一个UDP数据报.服务器端接收到数据后,从recvfrom中返回,在对数据进行处理后,再调用sendto函数将处理的结果返回客户端.UDP连接的通信过程如下图所示:


可见,UDP连接的通信过程相对于TCP连接的来说要简单不少.由于UDP服务器进程不需要向TCP协议的服务器那样要在倾听套接字上接收新建的连接,而只需要在绑定的端口上等待客户端发来的数据报,因此UDP服务器通常以循环的方式进行工作.

还有一点不同之处,TCP服务器通常在于客户端建立连接后就被一个客户端独占,若要实现能同时为多个客户端提供服务,则需要采取多个服务器子线程或子进程.而UDP服务器并不同客户机建立连接,所以客户机并不会独占UDP服务器.例如,DNS服务器采用的UDP协议,当服务器处理完某个客户端发来的数据报后,便可理解去处理另外一个客户端的数据报,中间省略了许多费时的建立连接和销毁连接的过程.提高了服务器的处理容量.

2.UDP通信服务器端

下面我们来看一个UDP服务器端程序的例子.下一篇文章会讲解客户端程序的编写.

/**************************************************************************************/
/*简介:UDPServer示例。										 */
/*************************************************************************************/
#include <stdio.h>        
#include <stdlib.h>
#include <strings.h>      
#include <unistd.h>       
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h>

#define PORT 2000           /* 监听端口 */ 
#define MAXDATASIZE 100     /* 缓冲区的大小 */ 
#define STR "Welcome to my server.\n"

int main() 
{
	int sockfd;
	/* 服务器的地址信息 */ 
	struct sockaddr_in server; 
	/* 客户端的地址信息 */ 
	struct sockaddr_in client; 
	int sin_size; 
	int num;
	/* 接收缓冲区 */
	char msg[MAXDATASIZE];  

	/* 创建UDP套接字  */
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)  
	{
		perror("Creating socket failed.");
		exit(1);
	}

	bzero(&server,sizeof(server));
	server.sin_family=AF_INET; 
	server.sin_port=htons(PORT); 
	server.sin_addr.s_addr = htonl (INADDR_ANY); 
	if (bind(sockfd, (struct sockaddr *)&server, \
				sizeof(struct sockaddr)) == -1) 
	{ 
		/* handle exception */
		perror("Bind error.");
		exit(1); 
	}    

	sin_size=sizeof(struct sockaddr_in); 
	while (1)   
	{
		num = recvfrom(sockfd,msg,MAXDATASIZE,0,\
				(struct sockaddr *)&client,&sin_size);                                    
		if (num < 0)
		{
			perror("recvfrom error\n"); 
			exit(1); 
		} 

		msg[num] = '\0';
		printf("You got a message (%s) from %s\n",msg,\
				inet_ntoa(client.sin_addr) );  
		/*向客户端发送消息*/
		sendto(sockfd,STR,strlen(STR),0,\
				(struct sockaddr *)&client,sin_size);
		/*若消息是quit,则退出服务器程序*/
		if (!strcmp(msg,"quit")) break;
	} 
	/*关闭套接字*/    
	close(sockfd);  
	return 0;
}

这个服务器要实现的功能是:创建一个UDP的socket,在端口2000上等待数据报.当收到信的数据报后,获得客户端发来的消息,而后根据数据报中包含的发送者的地址信息,向客户端发回一条欢迎信息,最后判断该消息是否为退出命令,如果不是就继续上述的工作,否则就结束服务器进程.

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ce123/article/details/13501831

智能推荐

PARL集群并行计算-再也不说python是伪线程了_python parl_AI Studio的博客-程序员宅基地

PARL集群并行计算-再也不说python是伪线程了PARL 是一个高性能、灵活的强化学习框架。PARL的目标是构建一个可以完成复杂任务的智能体。在PARL中提供了简易高效的并行接口,只要一个修饰符(parl.remote_class)就可以帮助用户实现自己的并行算法。下面我们用最近的飞桨2.2.0RC版本进行实验展示,这个版本比正式版本会多一些输出信息。最新决定:还是用2.1.2版本进行展示,最新版本实在难以掌控。2021.11.9飞桨升级到2.2正式发行版了,经测试本项目运行正常,因此升级到2._python parl

DTW距离,时间序列之间的距离-程序员宅基地

在日常的生活中我们最经常使用的距离毫无疑问应该是欧式距离,但是对于一些特殊情况,欧氏距离存在着其很明显的缺陷,比如说时间序列,举个比较简单的例子,序列A:1,1,1,10,2,3,序列B:1,1,1,2,10,3,如果用欧氏距离,也就是distance[i][j]=(b[j]-a[i])*(b[j]-a[i])来计算的话,总的距离和应该是128,应该说这个距离是非常大的,而实际上这个序列的图像是十分_dtw距离

有问有答,50道保姆级运维面试题,包教包会_运维客服面试题_王大雏的博客-程序员宅基地

有问有答,50道保姆级运维面试题,包教包会一、网络部分1、三次握手、四次挥手分别解释一下过程以及为什么是四次挥手?2、常用的TCP\UDP端口号及其功能3、BGP有哪几种类型,分别用于哪些场景?4、点到点与端到端通信5、OSPF五包、七状态6、二层交换机能做什么?7、IP地址的分类8、私有网络地址的分类9、OSI七层模型和TCP/IP参考模型10、TCP/IP协议栈各层的主要协议11、4、DHCP工作原理12、数据在TCP/IP协议栈中的封装与解封装13、交换机的工作原理二、Linux1、简单说说dhcp交_运维客服面试题

python-import依赖提示Segmentation fault (core dumped)解决方法-程序员宅基地

python-import依赖提示Segmentation fault (core dumped)解决方法

oracle误删除数据恢复-程序员宅基地

这样的,之前一起做网厅的时候小胡跟我说过,一次在生产环境删数据时因为没加条件,直接把整个表的数据清空了,甚是捏了把汗,后来幸亏有数据备份,那如果没有备份呢??从此小胡很幽默的总结了一句,“进行数据库操作,delete后面一定要加where”。今天无意中在网上看到了关于oracle误删除数据恢复的一条信息,发现的确很好使,下面就我的测试向大家汇报下。hhhhh 1. select * f...

IAR新建stm32工程_iar工程的结构-程序员宅基地

原地址为:http://www.cnblogs.com/wolf-ming/p/5313250.html——————————————————————————————————————————————————————————————————————stm32是一个当下非常流行的微控制器,很多人都加入了学习stm32的行列中,常用的stm32编译器有IAR和mdk两种,接下来是利用stm_iar工程的结构

随便推点

列表:使用python去除列表a中所有列表b有的元素_python 数组a 排除数组b-程序员宅基地

前提:有两个列表,列表a和列表b,要求去除列表a中所有在列表b中的包含的元素代码如下:def array_diff(a, b): #定义空列表 c=[] #range(len(a))取的为列表a的索引,根据a的 for i in range(len(a)): #取出索引对应的值 t=a[i] #判断值是否存在在序列b中 if t not in b: #如果序列不在b中,则写入序列c _python 数组a 排除数组b

前端的伙伴们, chrome canary 控制台添加了一个非常实用的功能-程序员宅基地

Chrome Canary JS 控制台 新加入参数提示功能马上更新你的 Chrome Canary 来体验下吧转载于:https://juejin.im/post/5afbc6c66fb9a07ab83e34d4_chrome canary 设置跨域

计算机复试 英文介绍,计算机专业考研复试英文自我介绍模板(1页)-原创力文档...-程序员宅基地

计算机专业考研复试英文自我介绍模板Good morning,deer professors.I am glad to be here for this interview.My name is XXX, 23 years old. I come from LuAn, a city of AnHui Province. I am going to graduate from the mathemat...

eve-ng 自定义linux镜像_eve-ng定制vmware镜像_Alxduo的博客-程序员宅基地

通过eve-ng模拟器构建自定义linux镜像_eve-ng定制vmware镜像

论文研读摘要之基金业绩评估及持续性研究结构详解_基金业绩持续性检验怎么做-程序员宅基地

一、A股私募基金起源1A股私募基金源自民间“代客理财”,2001年7000亿,2007年就达到1W亿。信托投资计划:即阳光私募。主流财经媒体及证券界所指的私募基金主要就是信托投资计划、券商集合理财、基金专户理财。详情参见《基金与私募基金概念解析:共同基金、单位信托、投资信托计划、券商集合理财、基金专户理财》1.1私募基金成因的制度性分析林毅夫(1988)研究中国农业家庭承包责任制..._基金业绩持续性检验怎么做

推荐文章

热门文章

相关标签