嵌入式linux的网络编程(4)--UDPServer程序设计
嵌入式linux的网络编程(4)--UDP Server程序设计
前面介绍了基于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上等待数据报.当收到信的数据报后,获得客户端发来的消息,而后根据数据报中包含的发送者的地址信息,向客户端发回一条欢迎信息,最后判断该消息是否为退出命令,如果不是就继续上述的工作,否则就结束服务器进程.
- 11-131分钟学会U盘启动安装Linux系统
- 11-13克隆MAC地址来绕过强制门户
- 11-13Linux运维常见故障及处理的 32 个锦囊妙计
- 11-13如何快速以管理员权限运行Linux命令?
- 11-13超全面的Linux应急响应技巧
- 11-136 款面向 Linux 用户的开源绘图应用程序
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 12-05亚马逊推出新一代基础模型 任意模态生成大模
- 12-05OpenAI拓展欧洲业务 将在苏黎世设立办公室
- 12-05微软质疑美国联邦贸易委员会泄露信息 督促其
- 12-05联交所取消宝宝树上市地位 宝宝树:不会对公
- 12-04企业微信致歉:文档打开异常已完成修复