UDP通讯模型简单示例
1. UDP通讯模型
2. 服务器端
① 创建一个socket,用函数socket()
② 绑定IP地址、端口等信息到socket上,用函数bind()
③ 循环接收数据,用函数recvfrom()
④ 关闭网络连接
3. 客户端
① 创建一个socket,用函数socket()
② 绑定IP地址、端口等信息到socket上,用函数bind()
③ 设置服务器端IP地址和端口等属性
④ 发送数据,用函数sendto()
⑤ 关闭网络连接
4. 简单示例
① 服务器端
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #include <arpa/inet.h> #define SERVER_PORT 8888 #define MAX_MSG_SIZE 1024 void udps_respon(int sockfd) { struct sockaddr_in addr; int addrlen, n; char msg[MAX_MSG_SIZE]; while(1) { /* 从网络上读,并写到网络上 */ bzero(msg, sizeof(msg)); // 初始化,清零 addrlen = sizeof(struct sockaddr); n = recvfrom(sockfd, msg, MAX_MSG_SIZE, 0, (struct sockaddr*)&addr, &addrlen); // 从客户端接收消息 msg[n] = 0;//将收到的字符串尾端添加上字符串结束标志 /* 显示服务端已经收到了信息 */ fprintf(stdout, "Server have received %s", msg); // 显示消息 } } int main(void) { int sockfd; struct sockaddr_in addr; /* 服务器端开始建立socket描述符 */ sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd < 0) { fprintf(stderr, "Socket Error:%s\n", strerror(errno)); exit(1); } /* 服务器端填充 sockaddr结构 */ bzero(&addr, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(SERVER_PORT); /* 捆绑sockfd描述符 */ if(bind(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)) < 0) { fprintf(stderr, "Bind Error:%s\n", strerror(errno)); exit(1); } udps_respon(sockfd); // 进行读写操作 close(sockfd); }
② 客户端
#include <stdlib.h> #include <stdio.h> #include <errno.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #include <arpa/inet.h> #define SERVER_PORT 8888 #define MAX_BUF_SIZE 1024 void udpc_requ(int sockfd, const struct sockaddr_in *addr, int len) { char buffer[MAX_BUF_SIZE]; int n; while(1) { /* 从键盘读入,写到服务端 */ printf("Please input char:\n"); fgets(buffer, MAX_BUF_SIZE, stdin); sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)addr, len); bzero(buffer, MAX_BUF_SIZE); } } int main(int argc,char **argv) { int sockfd; struct sockaddr_in addr; if(argc != 2) { fprintf(stderr, "Usage:%s server_ip\n",argv[0]); exit(1); } /* 建立 sockfd描述符 */ sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd < 0) { fprintf(stderr,"Socket Error:%s\n",strerror(errno)); exit(1); } /* 填充服务端的资料 */ bzero(&addr, sizeof(struct sockaddr_in)); addr.sin_family = AF_INET; addr.sin_port = htons(SERVER_PORT); if(inet_aton(argv[1], &addr.sin_addr) < 0) /*inet_aton函数用于把字符串型的IP地址转化成网络2进制数字*/ { fprintf(stderr,"Ip error:%s\n",strerror(errno)); exit(1); } udpc_requ(sockfd, &addr, sizeof(struct sockaddr_in)); // 进行读写操作 close(sockfd); }