unix域socket通信实例

socket服务器端:server.c  
[html]  view plain  copy
 print ?
  1. //socket读写默认的是非阻塞的  
[html]  view plain  copy
 print ?
  1. <pre class="cpp" name="code">#include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <malloc.h>  
  5. #include <sys/types.h>  
  6. #include <errno.h>  
  7. #include <sys/stat.h>  
  8. #include <fcntl.h>  
  9. #include <sys/select.h>  
  10. #include <unistd.h>  
  11. #include <termios.h>  
  12. #include <sys/stat.h>  
  13. /**********定时器头文件***************/  
  14. #include <sys/time.h>   
  15. #include <signal.h>   
  16. /***********进程间SOCKET通信头文件**********/  
  17. #include <sys/socket.h>   
  18. #include <sys/un.h>   
  19.   
  20. #define UNIX_DOMAIN "/tmp/UNIX2.domain"   
  21.   
  22. static char recv_php_buf[256];  //接收client数据的缓冲  
  23. static int recv_php_num=0;      //接收client数据的总长度  
  24. const char recv_php_buf1[20]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};  
  25. void main()  
  26. {  
  27.     socklen_t clt_addr_len;   
  28.     int listen_fd;   
  29.     int com_fd;   
  30.     int ret=0;   
  31.     int i;   
  32.       
  33.     int len;   
  34.     struct sockaddr_un clt_addr;   
  35.     struct sockaddr_un srv_addr;   
  36.     while(1)  
  37.     {  
  38.         //创建用于通信的套接字,通信域为UNIX通信域   
  39.   
  40.         listen_fd=socket(AF_UNIX,SOCK_STREAM,0);   
  41.         if(listen_fd<0)  
  42.         {   
  43.             perror("cannot create listening socket");   
  44.             continue;   
  45.         }   
  46.         else  
  47.         {  
  48.             while(1)  
  49.             {  
  50.                 //设置服务器地址参数   
  51.                 srv_addr.sun_family=AF_UNIX;   
  52.                 strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);   
  53.                 unlink(UNIX_DOMAIN);   
  54.                 //绑定套接字与服务器地址信息   
  55.                 ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));   
  56.                 if(ret==-1)  
  57.                 {   
  58.                     perror("cannot bind server socket");   
  59.                     close(listen_fd);   
  60.                     unlink(UNIX_DOMAIN);   
  61.                     break;   
  62.                 }   
  63.                 //对套接字进行监听,判断是否有连接请求   
  64.                 ret=listen(listen_fd,1);   
  65.                 if(ret==-1)  
  66.                 {   
  67.                     perror("cannot listen the client connect request");   
  68.                     close(listen_fd);   
  69.                     unlink(UNIX_DOMAIN);   
  70.                     break;   
  71.                 }   
  72.                 chmod(UNIX_DOMAIN,00777);//设置通信文件权限  
  73.                 while(1)  
  74.                 {  
  75.                     //当有连接请求时,调用accept函数建立服务器与客户机之间的连接   
  76.                     len=sizeof(clt_addr);   
  77.                     com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);   
  78.                     if(com_fd<0)  
  79.                     {   
  80.                         perror("cannot accept client connect request");   
  81.                         close(listen_fd);   
  82.                         unlink(UNIX_DOMAIN);   
  83.                         break;   
  84.                     }   
  85.                     //读取并输出客户端发送过来的连接信息   
  86.                     memset(recv_php_buf,0,256);   
  87.                     recv_php_num=read(com_fd,recv_php_buf,sizeof(recv_php_buf));   
  88.                     printf("\n=====recv=====\n");  
  89.                     for(i=0;i<recv_php_num;i++)   
  90.                     printf("%d ",recv_php_buf[i]);   
  91.                     printf("\n");  
  92.                     /*if(recv_php_buf[0]==0x02)  
  93.                     {  
  94.                         if(recv_php_buf[recv_php_num-1]==0x00)  
  95.                         {  
  96.                             recv_php_buf[recv_php_num-1]=0x01;  
  97.                         }  
  98.                         else  
  99.                         {  
  100.                             recv_php_buf[recv_php_num-1]=0x00;  
  101.                         }  
  102.                     }  
  103.                     */  
  104.                     //recv_php_buf[20]+=1;  
  105.                     write(com_fd,recv_php_buf,recv_php_num);  
  106.                     printf("\n=====send=====\n");  
  107.                     for(i=0;i<recv_php_num;i++)   
  108.                     printf("%d ",recv_php_buf[i]);   
  109.                     printf("\n");  
  110.                     //write(com_fd,recv_php_buf,20);  
  111.                     close(com_fd);//注意要关闭连接符号,不然会超过连接数而报错  
  112.                 }  
  113.                   
  114.             }  
  115.   
  116.         }  
  117.     }</pre><br>  
  118. <pre></pre>  
[html]  view plain  copy
 print ?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <malloc.h>  
  5. #include <sys/types.h>  
  6. #include <errno.h>  
  7. #include <sys/stat.h>  
  8. #include <fcntl.h>  
  9. #include <sys/select.h>  
  10. #include <unistd.h>  
  11. #include <termios.h>  
  12. #include <sys/stat.h>  
  13. /**********定时器头文件***************/  
  14. #include <sys/time.h>   
  15. #include <signal.h>   
  16. /***********进程间SOCKET通信头文件**********/  
  17. #include <sys/socket.h>   
  18. #include <sys/un.h>   
  19.   
  20. #define UNIX_DOMAIN "/tmp/UNIX2.domain"   
  21.   
  22. static char recv_php_buf[256];  //接收client数据的缓冲  
  23. static int recv_php_num=0;      //接收client数据的总长度  
  24. const char recv_php_buf1[20]={0x00,0x01,0x02,0x03,0x04,0x05,0x06};  
  25. void main()  
  26. {  
  27.     socklen_t clt_addr_len;   
  28.     int listen_fd;   
  29.     int com_fd;   
  30.     int ret=0;   
  31.     int i;   
  32.       
  33.     int len;   
  34.     struct sockaddr_un clt_addr;   
  35.     struct sockaddr_un srv_addr;   
  36.     while(1)  
  37.     {  
  38.         //创建用于通信的套接字,通信域为UNIX通信域   
  39.   
  40.         listen_fd=socket(AF_UNIX,SOCK_STREAM,0);   
  41.         if(listen_fd<0)  
  42.         {   
  43.             perror("cannot create listening socket");   
  44.             continue;   
  45.         }   
  46.         else  
  47.         {  
  48.             while(1)  
  49.             {  
  50.                 //设置服务器地址参数   
  51.                 srv_addr.sun_family=AF_UNIX;   
  52.                 strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);   
  53.                 unlink(UNIX_DOMAIN);   
  54.                 //绑定套接字与服务器地址信息   
  55.                 ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));   
  56.                 if(ret==-1)  
  57.                 {   
  58.                     perror("cannot bind server socket");   
  59.                     close(listen_fd);   
  60.                     unlink(UNIX_DOMAIN);   
  61.                     break;   
  62.                 }   
  63.                 //对套接字进行监听,判断是否有连接请求   
  64.                 ret=listen(listen_fd,1);   
  65.                 if(ret==-1)  
  66.                 {   
  67.                     perror("cannot listen the client connect request");   
  68.                     close(listen_fd);   
  69.                     unlink(UNIX_DOMAIN);   
  70.                     break;   
  71.                 }   
  72.                 chmod(UNIX_DOMAIN,00777);//设置通信文件权限  
  73.                 while(1)  
  74.                 {  
  75.                     //当有连接请求时,调用accept函数建立服务器与客户机之间的连接   
  76.                     len=sizeof(clt_addr);   
  77.                     com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);   
  78.                     if(com_fd<0)  
  79.                     {   
  80.                         perror("cannot accept client connect request");   
  81.                         close(listen_fd);   
  82.                         unlink(UNIX_DOMAIN);   
  83.                         break;   
  84.                     }   
  85.                     //读取并输出客户端发送过来的连接信息   
  86.                     memset(recv_php_buf,0,256);   
  87.                     recv_php_num=read(com_fd,recv_php_buf,sizeof(recv_php_buf));   
  88.                     printf("\n=====recv=====\n");  
  89.                     for(i=0;i<recv_php_num;i++)   
  90.                     printf("%d ",recv_php_buf[i]);   
  91.                     printf("\n");  
  92.                     /*if(recv_php_buf[0]==0x02)  
  93.                     {  
  94.                         if(recv_php_buf[recv_php_num-1]==0x00)  
  95.                         {  
  96.                             recv_php_buf[recv_php_num-1]=0x01;  
  97.                         }  
  98.                         else  
  99.                         {  
  100.                             recv_php_buf[recv_php_num-1]=0x00;  
  101.                         }  
  102.                     }  
  103.                     */  
  104.                     //recv_php_buf[20]+=1;  
  105.                     write(com_fd,recv_php_buf,recv_php_num);  
  106.                     printf("\n=====send=====\n");  
  107.                     for(i=0;i<recv_php_num;i++)   
  108.                     printf("%d ",recv_php_buf[i]);   
  109.                     printf("\n");  
  110.                     //write(com_fd,recv_php_buf,20);  
  111.                     close(com_fd);//注意要关闭连接符号,不然会超过连接数而报错  
  112.                 }  
  113.                   
  114.             }  
  115.   
  116.         }  
  117.     }  
socket用户端:client.c  
[cpp]  view plain  copy
 print ?
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #include <malloc.h>  
  5. #include <sys/types.h>  
  6. #include <errno.h>  
  7. #include <sys/stat.h>  
  8. #include <fcntl.h>  
  9. #include <sys/select.h>  
  10. #include <unistd.h>  
  11. #include <termios.h>  
  12. #include <sys/stat.h>  
  13. /**********定时器头文件***************/  
  14. #include <sys/time.h>   
  15. #include <signal.h>   
  16. /***********进程间SOCKET通信头文件**********/  
  17. #include <sys/socket.h>   
  18. #include <sys/un.h>   
  19.   
  20. #include <sys/ioctl.h>  
  21. #pragma pack(1)         //设定为1字节对齐  
  22. #define UNIX_DOMAIN2 "/tmp/UNIX2.domain"   
  23. static char recv_php_buf[256]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07};      
  24. struct test  
  25. {  
  26.     char a;  
  27.     int b;  
  28.     int c;  
  29.   
  30.   
  31.   
  32.   
  33. }se;  
  34. void main(void)  
  35. {  
  36.     int connect_fd;  
  37.     int ret=0;  
  38.     int i;  
  39.     static struct sockaddr_un srv_addr;   
  40.     printf("ipc通信线程\n");  
  41.     //while(1)  
  42.     //{  
  43.         //创建用于通信的套接字,通信域为UNIX通信域   
  44.         connect_fd=socket(AF_UNIX,SOCK_STREAM,0);   
  45.         printf("%d\n",connect_fd);   
  46.         if(connect_fd<0)  
  47.         {   
  48.             perror("cannot create communication socket");  
  49.             printf("%d\n",connect_fd);   
  50.             //continue;  
  51.         }   
  52.         else  
  53.         {  
  54.             //while(1)  
  55.             //{  
  56.                 srv_addr.sun_family=AF_UNIX;   
  57.                 strcpy(srv_addr.sun_path,UNIX_DOMAIN2);  
  58.               
  59.                 //连接服务器   
  60.                 ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));   
  61.                 if(ret==-1)  
  62.                 {   
  63.                     close(connect_fd);   
  64.                     printf("connect fail\n");  
  65.                     //break;            //重新创建socket  
  66.                 }  
  67.                 else  
  68.                 {     
  69.                 //否则,连接服务器成功  
  70.                 //while(1)  
  71.                 //{  
  72.                     se.a=0x01;  
  73.                     se.b=0x01020304;  
  74.                     se.c=0x05060708;  
  75.                     write(connect_fd,recv_php_buf,20);//将数据传送到外部应用程序,发送实际长度  
  76.                     //write(connect_fd,&se,sizeof(struct test));  
  77.                     memset(recv_php_buf,0,sizeof(recv_php_buf));                             //清空socket_buf  
  78.                     //sleep(1);  
  79.                     //fcntl(connect_fd,F_SETEL,O_NONBLOCK);  
  80.                     read(connect_fd,recv_php_buf,sizeof(recv_php_buf));  
  81.                     printf("receive over\n");  
  82.                     for(i=0;i<20;i++)  
  83.                     printf("%x ",recv_php_buf[i]);  
  84.                     //printf("%x ",se.a);  
  85.                     //printf("%x ",se.b);  
  86.                     //printf("%x ",se.c);  
  87.                     close(connect_fd);  
  88.                     //break;                              
  89.                 //}  
  90.                 }  
  91.               
  92.             //}  
  93.             //close(connect_fd);  
  94.         }  
  95.       
  96.     //}  
  97.   
  98. }  
下面是一个简单的 Unix Domain Socket 通信实例,包括了服务端和客户端代码: 服务端代码: ```cpp #include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define SOCK_PATH "/tmp/echo_socket" int main(int argc, char *argv[]) { int s, s2, len; struct sockaddr_un local, remote; char str[100]; if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } local.sun_family = AF_UNIX; strcpy(local.sun_path, SOCK_PATH); unlink(local.sun_path); len = strlen(local.sun_path) + sizeof(local.sun_family); if (bind(s, (struct sockaddr *)&local, len) == -1) { perror("bind"); exit(1); } if (listen(s, 5) == -1) { perror("listen"); exit(1); } printf("Waiting for a connection...\n"); while (1) { int done, n; unsigned int t; t = sizeof(remote); if ((s2 = accept(s, (struct sockaddr *)&remote, &t)) == -1) { perror("accept"); exit(1); } printf("Connected.\n"); done = 0; do { n = recv(s2, str, 100, 0); if (n <= 0) { if (n < 0) perror("recv"); done = 1; } if (!done) { if (send(s2, str, n, 0) < 0) { perror("send"); done = 1; } } } while (!done); close(s2); } return 0; } ``` 客户端代码: ```cpp #include <sys/socket.h> #include <sys/un.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #define SOCK_PATH "/tmp/echo_socket" int main(int argc, char *argv[]) { int s, len; struct sockaddr_un remote; char *str = "hello, world!"; if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } remote.sun_family = AF_UNIX; strcpy(remote.sun_path, SOCK_PATH); len = strlen(remote.sun_path) + sizeof(remote.sun_family); if (connect(s, (struct sockaddr *)&remote, len) == -1) { perror("connect"); exit(1); } if (send(s, str, strlen(str), 0) == -1) { perror("send"); exit(1); } if (recv(s, str, strlen(str), 0) == -1) { perror("recv"); exit(1); } printf("Received: %s\n", str); close(s); return 0; } ``` 服务端代码创建了一个 Unix Domain Socket 并监听,一旦有客户端连接进来,服务端就接收客户端发送的数据,并将其原样返回。客户端代码连接到服务端,并发送一个字符串,然后等待服务端返回数据并打印。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值