LinuxUDP网络通信

来源:互联网 发布:mac virtualbox u盘 编辑:程序博客网 时间:2024/06/16 00:31

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

那些函数我这里就不讲了,直接看我上一个博客就行,我这里直接附例子了。




udpserver.c

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:SimSun;font-size:18px;">#include <stdlib.h>    
  2. #include <stdio.h>    
  3. #include <errno.h>    
  4. #include <string.h>    
  5. #include <unistd.h>    
  6. #include <netdb.h>    
  7. #include <sys/socket.h>    
  8. #include <netinet/in.h>    
  9. #include <sys/types.h>    
  10. #include <arpa/inet.h>    
  11.     
  12. #define SERVER_PORT 8888     
  13. #define MAX_MSG_SIZE 1024     
  14.     
  15. void udps_respon(int sockfd)     
  16. {     
  17.     struct sockaddr_in addr;     
  18.     int addrlen,n;     
  19.     char msg[MAX_MSG_SIZE];     
  20.     
  21.     while(1)     
  22.     {   /* 从网络上读,并写到网络上 */     
  23.         bzero(msg,sizeof(msg)); // 初始化,清零    
  24.         addrlen = sizeof(struct sockaddr);     
  25.         n=recvfrom(sockfd,msg,MAX_MSG_SIZE,0,(struct sockaddr*)&addr,&addrlen); // 从客户端接收消息    
  26.         msg[n]=0;     
  27.         /* 显示服务端已经收到了信息 */     
  28.         fprintf(stdout,"Server have received %s",msg); // 显示消息    
  29.     }     
  30. }     
  31.     
  32. int main(void)     
  33. {     
  34.     int sockfd;     
  35.     struct sockaddr_in addr;     
  36.     
  37.     /* 服务器端开始建立socket描述符 */     
  38.     sockfd=socket(AF_INET,SOCK_DGRAM,0);     
  39.     if(sockfd<0)     
  40.     {     
  41.         fprintf(stderr,"Socket Error:%s\n",strerror(errno));     
  42.         exit(1);     
  43.     }     
  44.     
  45.     /* 服务器端填充 sockaddr结构 */     
  46.     bzero(&addr,sizeof(struct sockaddr_in));     
  47.     addr.sin_family=AF_INET;     
  48.     addr.sin_addr.s_addr=htonl(INADDR_ANY);     
  49.     addr.sin_port=htons(SERVER_PORT);     
  50.     
  51.     /* 捆绑sockfd描述符 */     
  52.     if(bind(sockfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in))<0)     
  53.     {     
  54.         fprintf(stderr,"Bind Error:%s\n",strerror(errno));     
  55.         exit(1);     
  56.     }     
  57.     
  58.     udps_respon(sockfd); // 进行读写操作    
  59.     close(sockfd);     
  60. } </span>   


udpclient.c

[objc] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <span style="font-family:SimSun;font-size:18px;">#include <stdlib.h>    
  2. #include <stdio.h>    
  3. #include <errno.h>    
  4. #include <string.h>    
  5. #include <unistd.h>    
  6. #include <netdb.h>    
  7. #include <sys/socket.h>    
  8. #include <netinet/in.h>    
  9. #include <sys/types.h>    
  10. #include <arpa/inet.h>    
  11.     
  12. #define SERVER_PORT 8888     
  13. #define MAX_BUF_SIZE 1024     
  14.     
  15. void udpc_requ(int sockfd,const struct sockaddr_in *addr,int len)     
  16. {     
  17.     char buffer[MAX_BUF_SIZE];     
  18.     int n;     
  19.     while(1)     
  20.     {   /* 从键盘读入,写到服务端 */     
  21.         printf("Please input char:\n");    
  22.         fgets(buffer,MAX_BUF_SIZE,stdin);     
  23.         sendto(sockfd,buffer,strlen(buffer),0,addr,len);     
  24.         bzero(buffer,MAX_BUF_SIZE);     
  25.     }     
  26. }     
  27.     
  28. int main(int argc,charchar **argv)     
  29. {     
  30.     int sockfd;     
  31.     struct sockaddr_in addr;     
  32.     
  33.     if(argc!=2)     
  34.     {     
  35.         fprintf(stderr,"Usage:%s server_ip\n",argv[0]);     
  36.         exit(1);     
  37.     }    
  38.     
  39.     /* 建立 sockfd描述符 */     
  40.     sockfd=socket(AF_INET,SOCK_DGRAM,0);     
  41.     if(sockfd<0)     
  42.     {     
  43.         fprintf(stderr,"Socket Error:%s\n",strerror(errno));     
  44.         exit(1);     
  45.     }     
  46.     
  47.     /* 填充服务端的资料 */     
  48.     bzero(&addr,sizeof(struct sockaddr_in));     
  49.     addr.sin_family=AF_INET;     
  50.     addr.sin_port=htons(SERVER_PORT);    
  51.     if(inet_aton(argv[1],&addr.sin_addr)<0)  /*inet_aton函数用于把字符串型的IP地址转化成网络2进制数字*/     
  52.     {     
  53.         fprintf(stderr,"Ip error:%s\n",strerror(errno));     
  54.         exit(1);     
  55.     }     
  56.     
  57.     udpc_requ(sockfd,&addr,sizeof(struct sockaddr_in)); // 进行读写操作    
  58.     close(sockfd);     
  59. }</span> 
0 0
原创粉丝点击