千家信息网

基于UDP协议的进程间通信

发表于:2024-11-29 作者:千家信息网编辑
千家信息网最后更新 2024年11月29日,UDP协议的主要特点:UDP是无连接的UDP使用尽最大努力交付UDP是面向报文的没有拥塞控制支持一对一、一对多、多对一、多对多的交互通信UDP首部开销小UDP协议是无连接的并且面向数据块的。所以cli
千家信息网最后更新 2024年11月29日基于UDP协议的进程间通信

UDP协议的主要特点:

  1. UDP是无连接的

  2. UDP使用尽最大努力交付

  3. UDP是面向报文的

  4. 没有拥塞控制

  5. 支持一对一、一对多、多对一、多对多的交互通信

  6. UDP首部开销小

UDP协议是无连接的并且面向数据块的。所以client端不需要与server端进行连接,直接发送消息。

server: 1 #include  2 #include  3 #include  4 #include  5 #include  6 #include  7 #include  8 void usage(char *port)  9 { 10     printf("%s,[ip],[port]\n",port); 11 } 12 int main(int argc,char *argv[]) 13 { 14     if(argc!=3) 15     { 16         usage(argv[0]); 17         exit(1); 18     } 19     int sock = socket(AF_INET,SOCK_DGRAM,0); //创建套接字 20     if(sock<0) 21     { 22         perror("socket"); 23         return 1; 24     } 25     int port = atoi(argv[2]); 26     char *ip = argv[1]; 27     struct sockaddr_in client; 28     client.sin_family = AF_INET; 29     client.sin_port = htons(port); 30     client.sin_addr.s_addr = inet_addr(ip); 31     if(bind(sock,(struct sockaddr*)&client,sizeof(client))<0) 32     { 33         perror("bind"); 34         exit(1); 35     } 36     char buf[1024]; 37     struct sockaddr_in remote; 38     socklen_t len = sizeof(remote); 39     while(1) 40     { 41         ssize_t size = recvfrom(sock,buf,sizeof(buf),0,(struct sockaddr*)&re    mote,&len);  //接收消息 42         if(size>0) 43         { 44             buf[size-1]='\0'; 45             printf("%s,%d: %s\n",inet_ntoa(remote.sin_addr),ntohs(remote.sin    _port),buf); 46  47         } 48         else if(size==0) 49         {} 50         else 51         { 52             perror("recvfrom"); 53             exit(2); 54         } 55         fflush(stdout); 56     } 57     return 0; 58 }  client: 1 #include  2 #include  3 #include  4 #include  5 #include  6 #include  7 #include  8 #include  9 void usage(char *port) 10 { 11     printf("%s,[ip],[port]\n",port); 12 } 13 int main(int argc,char *argv[]) 14 { 15     if(argc!=3) 16     { 17         usage(argv[0]); 18         exit(1); 19     } 20     int sock = socket(AF_INET,SOCK_DGRAM,0); 21     if(sock<0) 22     { 23         perror("socket");  24         return 1; 25     } 26     int port = atoi(argv[2]); 27     char *ip = argv[1]; 28     struct sockaddr_in remote; 29     remote.sin_family = AF_INET; 30     remote.sin_port = htons(port); 31     remote.sin_addr.s_addr = inet_addr(ip); 32     char buf[1024]; 33     while(1) 34     { 35         memset(buf,'\0',sizeof(buf)); 36         ssize_t _s = read(0,buf,sizeof(buf)-1); 37         if(_s<0) 38         { 39             perror("read"); 40             exit(1); 41         } 42         ssize_t size = sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&remo    te,sizeof(remote)); //发送消息 43         if(size<0) 44         { 45             perror("sendto");  46             exit(1); 47         } 48  49     } 50     return 0; 51 }   [fbl@localhost udp]$ ./server 192.168.1.106 8080192.168.1.106,33647: how are you192.168.1.106,33647: hi192.168.1.106,33647: hnxu^C[fbl@localhost udp]$ [fbl@localhost udp]$ ./client 192.168.1.106 8080how are youhihnxu^C[fbl@localhost udp]$


0