Linux c==使用UDP实现网络通信(14)

来源:互联网 发布:不喝牛奶 知乎 编辑:程序博客网 时间:2024/04/30 10:00

UDP
前面已经讲过tcp网络通信,然后tcp每次通信都要进行三次握手连接,虽然传输的可靠性比较高,但对于一些及时性的数据的传输显得太过费时,所以就有了UDP这种无连接通信,但数据容易出错。

<span style="font-family:SimSun;font-size:18px;">#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);     } </span>   
<span style="font-family:SimSun;font-size:18px;">#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,addr,len);             bzero(buffer,MAX_BUF_SIZE);         }     }     int main(int argc,charchar **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);     }</span> 
0 0
原创粉丝点击