UDP服务器、客户端的简单实现

xiaoxiao2021-02-28  103

TCP协议和UDP协议的区别: TCP:面向连接,传输可靠(保证数据正确性,保证数据顺序),用于传输大量数据(流模式),速度慢,建立连接需要开销较多。 UDP:面向非连接,传输不可靠,用于传输少量数据(数据包模式),速度快。 UDP协议的搭建流程 ---------------------------UDP通信接收端----------------------------------- 1.创建socket   头文件:       #include <sys/types.h>          /* See NOTES */       #include <sys/socket.h> 函数原型:        int socket(int domain, int type, int protocol); 参数一:IP协议          AF_INET             IPv4 Internet protocols          ip(7)                             AF_INET6            IPv6 Internet protocols          ipv6(7)                                      AF_IPX              IPX - Novell protocols 参数二:传输协议       SOCK_STREAM    ---》TCP协议                        SOCK_DGRAM    ---》UDP协议 参数三:socket的属性    填写为0 默认属性 返回值:成功发回 新的socket文件描述符 , 失败返回  -1 2.绑定socket 头文件:           #include <sys/types.h>          /* See NOTES */         #include <sys/socket.h> 函数原型:            int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 参数一:创建的socket文件描述符 参数二:服务器绑定信息 参数三:服务器信息结构体的大小 返回值:成功返回0 ,失败返回-1 3.接收函数     ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,                         struct sockaddr *src_addr, socklen_t *addrlen);    参数一:socket文件描述符    参数二: 接收缓存区      参数三:接收数据的大小     参数四:接收函数的属性   0默认属性       参数五:保存发送方的IP信息     参数六:成功获取对方信息的大小 ---------------------------UDP通信发送端----------------------------------- 1.创建socket   头文件:       #include <sys/types.h>          /* See NOTES */       #include <sys/socket.h> 函数原型:        int socket(int domain, int type, int protocol); 参数一:IP协议          AF_INET             IPv4 Internet protocols          ip(7)                             AF_INET6            IPv6 Internet protocols          ipv6(7)                                      AF_IPX              IPX - Novell protocols 参数二:传输协议       SOCK_STREAM    ---》TCP协议                        SOCK_DGRAM    ---》UDP协议 参数三:socket的属性    填写为0 默认属性 返回值:成功发回 新的socket文件描述符 , 失败返回  -1 2.发送函数  ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,                       const struct sockaddr *dest_addr, socklen_t addrlen);    参数一:socket文件描述符    参数二: 发送缓存区      参数三:发送数据的大小     参数四:发送函数的属性   0默认属性       参数五:接收方的IP信息       参数六:IP信息结构体的大小 ----------------------------------------------------------------------------------------------------------------------- 练习:udp服务器和客户端的简单通信实现 【udprecv.c】 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <string.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> int main(int argv,char **argc) { //创建socket int sockfd = socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { perror("create sock fail\n"); } //设置接收端信息 struct sockaddr_in addr; bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argc[1])); addr.sin_addr.s_addr = inet_addr("0.0.0.0");//0.0.0.0为万能地址,可自动匹配IP //绑定接收端信息 char buf[100]={0}; int ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)); if(ret < 0) perror("bind fail:"); //接收UDP数据包 struct sockaddr_in client_addr; bzero(&client_addr,sizeof(client_addr)); int len = sizeof(client_addr); while(1) { ssize_t ret = recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&client_addr,&len); if(ret < 0) perror("error:"); else printf("buf = %s\n",buf); } close(sockfd); } ----------------------------------------------------------------------------------------------------------------------- 【udpsend.c】 #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> #include <string.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdio.h> int main(int argv,char **argc) { //创建socket int sockfd=socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) { perror("create sock fail\n"); } //设置接收端的信息 struct sockaddr_in addr; bzero(&addr,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(atoi(argc[1])); addr.sin_addr.s_addr = inet_addr(argc[2]); char buf[10]={"udpdate"}; int ret=0; //发送UDP数据包 while(1) { ret=sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&addr,sizeof(addr)); if(ret>0) { printf("buf=%s\tsize=%d\n",buf,ret); } sleep(1); } close(sockfd); } ----------------------------------------------------------------------------------------------------------------------- 程序运行时必须 先运行服务器程序再运行客户端程序,并且设置端口和服务器ip地址
转载请注明原文地址: https://www.6miu.com/read-66078.html

最新回复(0)