基于UDP协议的进程间通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于UDP协议的进程间通信相关的知识,希望对你有一定的参考价值。

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

server:
 1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/types.h>
  4 #include<sys/socket.h>
  5 #include<netinet/in.h>
  6 #include<arpa/inet.h>
  7 #include<string.h>
  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<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/types.h>
  4 #include<sys/socket.h>
  5 #include<string.h>
  6 #include<unistd.h>
  7 #include<netinet/in.h>
  8 #include<arpa/inet.h>
  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 }
 
 
 [[email protected] udp]$ ./server 192.168.1.106 8080
192.168.1.106,33647: how are you
192.168.1.106,33647: hi
192.168.1.106,33647: hnxu
^C
[[email protected] udp]$ 
[[email protected] udp]$ ./client 192.168.1.106 8080
how are you
hi
hnxu
^C
[[email protected] udp]$


本文出自 “小镇青苔” 博客,请务必保留此出处http://fengbaoli.blog.51cto.com/10538178/1782254

以上是关于基于UDP协议的进程间通信的主要内容,如果未能解决你的问题,请参考以下文章

Android 基于UDP的Socket通信

基于UDP协议通信的套接字/UDP协议介绍/基于UDP协议查找DNS/进程介绍/操作系统与进程发展史

基于TCP协议的网络通信(socket编程)

基于TCP协议的网络通信(socket编程)

基于TCP协议的socket编程

基于Unity的编辑器开发: 进程间通信