标签:
基于UDP--通讯模型
由上图可以看出UDP通讯的步骤如下:
基于UDP-服务器
1、创建一个socket,用函数socket();
2、绑定IP地址、端口等信息到socket上,用函数bind();
3、循环接收数据,用函数recvfrom();
4、关闭网络连接;
基于UDP-客户端
1、创建一个socket,用函数socket();
2、绑定IP地址、端口等信息到socket上,用函数bind();
3、设置对方的IP地址和端口等属性;
4、发送数据,用函数sendto();
5、关闭网络连接;
示例程序如下:
服务端:
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <stdlib.h> #include <arpa/inet.h> #include <errno.h> #define PROT_NUMBER 3333 int main(int argc, char *argv[]){ int server_fd; //创建socket server_fd = socket(AF_INET, SOCK_DGRAM, 0); if(server_fd == -1){ fprintf(stderr,"socket : %s\n",strerror(errno)); exit(EXIT_FAILURE); } //填充socket信息 struct sockaddr_in server_addr, client_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PROT_NUMBER); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //绑定socket if((bind(server_fd,(struct sockaddr *)(&server_addr),sizeof(server_addr))) == -1){ fprintf(stderr,"bind : %s\n",strerror(errno)); exit(EXIT_FAILURE); } char str[1024]; while(1){ socklen_t addrlen = sizeof(client_addr); //等待接收消息 if((recvfrom(server_fd, str, sizeof(str), 0,(struct sockaddr *)(&client_addr),&addrlen) == -1)){ fprintf(stderr,"recvfrom :%s\n",strerror(errno)); exit(EXIT_FAILURE); } else{ printf("Server get from %s\n",inet_ntoa(client_addr.sin_addr)); printf("Server received %s\n",str); } bzero(str,sizeof(str)); } return 0; }
客户端:
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h> #define SERVER_PORT 3333 #define SEND_BUF 1024 int main(int argc, char *argv[]){ int client_fd; struct sockaddr_in server_addr; char send_buf[SEND_BUF]; //创建socket if((client_fd= socket(AF_INET, SOCK_DGRAM, 0)) == -1){ fprintf(stderr,"socket :%s\n",strerror(errno)); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(struct sockaddr_in)); //填充服务端socket套结字 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); if(0 == inet_aton(argv[1],&server_addr.sin_addr)){ fprintf(stderr,"%s Invalid address\n",argv[1]); } bzero(&send_buf, SEND_BUF); while(1){ fgets(send_buf, SEND_BUF, stdin); //发送信息 if(sendto(client_fd, send_buf, sizeof(send_buf), 0, (struct sockaddr *)(&server_addr), sizeof(server_addr)) == -1){ fprintf(stderr,"sendto :%s",strerror(errno)); exit(EXIT_FAILURE); } } return 0; }
总结:
1、第一次编译时,struct sockaddr_in server_addr; 这行报错,报错内容为 ‘server_addr’的存储大小未知。经检查发现缺少头文件arpa/inet.h。出现一个警告:隐式声明与内建函数‘bzero’不兼容 [默认启用]。经检查发现缺少头文件string.h
2、在UDP通信中,客户端可以省略绑定操作。
3、因为省略了客户端的connect操作,所以客户端与服务端谁先启动都可以。(因为是无连接的,一端没启动,传送消息时另一端没启动的话消息会丢失)
标签:
原文地址:http://blog.csdn.net/u011641885/article/details/46642963