分享

本地通信实例(AF_UNIX) socket协议通信

 wusiqi111 2017-03-14

程序说明:
程序里包含服务端和客户端两个程序,它们之间使用 AF_UNIX 实现本机数据流通信。使用 AF_UNIX 域实际上是使用本地 socket 文件来通信。

服务器端代码:

  1. #include <sys/types.h>  
  2. #include <sys/socket.h>  
  3. #include <stdio.h>  
  4. #include <sys/un.h>  
  5. #include <unistd.h>  
  6. #include <stdlib.h>  
  7.   
  8. int main (int argc, char *argv[])  
  9. {  
  10. int server_sockfd, client_sockfd;  
  11. int server_len, client_len;  
  12. struct sockaddr_un server_address; /*声明一个UNIX域套接字结构*/  
  13. struct sockaddr_un client_address;  
  14. int i, bytes;  
  15. char ch_send, ch_recv;  
  16.   
  17. unlink ("server_socket"); /*删除原有server_socket对象*/  
  18.   
  19. /*创建 socket, 通信协议为AF_UNIX, SCK_STREAM 数据方式*/  
  20. server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0);  
  21.   
  22. /*配置服务器信息(通信协议)*/  
  23. server_address.sun_family = AF_UNIX;  
  24.   
  25. /*配置服务器信息(socket 对象)*/  
  26. strcpy (server_address.sun_path, "server_socket");  
  27.   
  28. /*配置服务器信息(服务器地址长度)*/  
  29. server_len = sizeof (server_address);  
  30.   
  31. /*绑定 socket 对象*/  
  32. bind (server_sockfd, (struct sockaddr *)&server_address, server_len);  
  33.   
  34. /*监听网络,队列数为5*/  
  35. listen (server_sockfd, 5);  
  36.   
  37. printf ("Server is waiting for client connect...\n");  
  38.   
  39. client_len = sizeof (client_address);  
  40.   
  41. /*接受客户端请求; 第2个参数用来存储客户端地址; 第3个参数用来存储客户端地址的大小*/  
  42. /*建立(返回)一个到客户端的文件描述符,用以对客户端的读写操作*/  
  43. client_sockfd = accept (server_sockfd, (struct sockaddr *)&server_address, (socklen_t *)&client_len);  
  44. if (client_sockfd == -1) {  
  45. perror ("accept");  
  46. exit (EXIT_FAILURE);  
  47. }  
  48.   
  49. printf ("The server is waiting for client data...\n");  
  50.   
  51. for (i = 0, ch_send = '1'; i < 5; i++, ch_send++) {  
  52. if ((bytes = read (client_sockfd, &ch_recv, 1)) == -1) {  
  53. perror ("read");  
  54. exit (EXIT_FAILURE);  
  55. }  
  56.   
  57. printf ("The character receiver from client is %c\n", ch_recv);  
  58.   
  59. sleep (1);  
  60.   
  61. if ((bytes = write (client_sockfd, &ch_send, 1)) == -1) {  
  62. perror ("read");  
  63. exit (EXIT_FAILURE);  
  64. }  
  65. }  
  66.   
  67. close (client_sockfd);  
  68. unlink ("server socket");  
  69. }  


客户端代码:

  1. #include <sys/types.h>  
  2. #include <sys/socket.h>  
  3. #include <stdio.h>  
  4. #include <sys/un.h>  
  5. #include <unistd.h>  
  6. #include <stdlib.h>  
  7.   
  8. int main (int argc, char *argv[])  
  9. {  
  10. struct sockaddr_un address;  
  11. int sockfd;  
  12. int len;  
  13. int i, bytes;  
  14. int result;  
  15. char ch_recv, ch_send;  
  16.   
  17. /*创建socket,AF_UNIX通信协议,SOCK_STREAM数据方式*/  
  18. if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {  
  19. perror ("socket");  
  20. exit (EXIT_FAILURE);  
  21. }  
  22.   
  23. address.sun_family = AF_UNIX;  
  24. strcpy (address.sun_path, "server_socket");  
  25. len = sizeof (address);  
  26.   
  27. /*向服务器发送连接请求*/  
  28. result = connect (sockfd, (struct sockaddr *)&address, len);  
  29. if (result == -1) {  
  30. printf ("ensure the server is up\n");  
  31. perror ("connect");  
  32. exit (EXIT_FAILURE);  
  33. }  
  34.   
  35. for (i = 0, ch_send = 'A'; i < 5; i++, ch_send++) {  
  36. if ((bytes = write(sockfd, &ch_send, 1)) == -1) { /*发消息给服务器*/  
  37. perror ("write");  
  38. exit (EXIT_FAILURE);  
  39. }  
  40.   
  41. sleep (2); /*休息二秒钟再发一次*/  
  42.   
  43. if ((bytes = read (sockfd, &ch_recv, 1)) == -1) { /*接收消息*/  
  44. perror ("read");  
  45. exit (EXIT_FAILURE);  
  46. }  
  47.   
  48. printf ("receive from server data is %c\n", ch_recv);  
  49. }  
  50. close (sockfd);  
  51.   
  52. return (0);  
  53. }  


 

程序说明:
先运行服务器端,然后再运行客户端可以在两边同时看到输出。服务器端先运行后会出现如下提示:
引用
./sock_local_server 
Server is waiting for client connect...

这表示,服务器端已经被阻塞到到 accept() 这里,服务器就在此等候客户端的连接。
如果不是先运行服务器端,而直接运行客户端,那么客户端会提示:
引用
./sock_local_client 
ensure the server is up
connect: Connection refused

提示服务器没有准备好,连接被拒绝,从而直接退出程序。

如果服务器和客户端依次运行,可以在两边看到输出:
服务器端:
引用
./sock_local_server 
Server is waiting for client connect...
The server is waiting for client data...
The character receiver from client is A
The character receiver from client is B
The character receiver from client is C
The character receiver from client is D
The character receiver from client is E

客户端:
引用
./sock_local_client 
receive from server data is 1
receive from server data is 2
receive from server data is 3
receive from server data is 4
receive from server data is 5

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多