歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> UNIX domain ( UNIX 預協議 ) 實例

UNIX domain ( UNIX 預協議 ) 實例

日期:2017/3/1 10:26:00   编辑:Linux編程

一般在我們自己的主機上通信的時候,前面也講到過可以使用pipe,fifo,msg,共享內存之類,如果你想使用套接字的話,當然TCP/IP的套接字也是可以的,只要指定server的IP = 127.0.0.1 或者你的當前主機的實際接入網絡的IP也是可以的!但是相對與此處的UNIX domain來說,在效率上可能會低一點點、、、

UNIX domain的實際操作和前面的TCP/IP中的實際的操作的框架流程是差不多的!只是其中的細節的變化要注意!

代碼貼下:

server端:

  1. /*
  2. 在主機之間的通信可以使用TCP/IP套接字進行通信,
  3. 但是在實現的效率上是不如UNIX DOMAIN的,所以
  4. 此處看看這個協議的處理!
  5. 其實實際操作中我們可以知道,與TCP/IP的操作流程
  6. 是差不多的!只是在一些細節上的變化!
  7. */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <errno.h>
  11. #include <string.h>
  12. #include <sys/types.h>
  13. #include <sys/socket.h>
  14. #include <sys/un.h>
  15. #define FILE "UNIX_DOMAIN" //!> 有點像FIFO中的文件是吧,呵呵
  16. #define MAXSIZE 1024
  17. #define MAXBACK 100
  18. int main( int argc, char ** argv )
  19. {
  20. int listen_fd;
  21. int conn_fd;
  22. int len;
  23. char recv[MAXSIZE];
  24. struct sockaddr_un servaddr;
  25. struct sockaddr_un childaddr;
  26. unlink( FILE ); //!> 保證麼有已經存在的文件
  27. //!> establish the socket
  28. //!>
  29. if( ( listen_fd = socket( AF_UNIX, SOCK_STREAM, 0 ) ) == -1 )
  30. {
  31. printf("Socket error : %d\n", errno);
  32. exit( EXIT_FAILURE );
  33. }
  34. servaddr.sun_family=AF_UNIX; //!> UNIX DOMAIN
  35. strncpy( servaddr.sun_path, FILE, sizeof( servaddr.sun_path ) - 1 ); //!> FILE
  36. //!> 綁定
  37. //!>
  38. if( bind( listen_fd, ( struct sockaddr * )&servaddr, sizeof( servaddr ) ) == -1 )
  39. {
  40. printf("Bind Error : %d\n", errno);
  41. close( listen_fd );
  42. unlink( FILE );
  43. exit( EXIT_FAILURE );
  44. }
  45. //!> 監聽
  46. //!>
  47. if( listen( listen_fd, MAXBACK ) == -1 )
  48. {
  49. printf("Listen error : %d\n", errno);
  50. close( listen_fd );
  51. unlink( FILE );
  52. exit( EXIT_FAILURE );
  53. }
  54. len = sizeof( childaddr );
  55. while( 1 )
  56. {
  57. //!> accept : 你懂得~
  58. if( ( conn_fd = accept( listen_fd, ( struct sockaddr *)&childaddr, &len ) ) == -1 )
  59. {
  60. printf("Accept Error : %d\n", errno);
  61. close( listen_fd );
  62. unlink( FILE );
  63. exit( EXIT_FAILURE );
  64. }
  65. while( 1 ) //!> 可能連續讀一個套接口上的內容!
  66. {
  67. memset( recv, 0, sizeof( recv ) );
  68. len = read( conn_fd, recv, sizeof( recv ) );
  69. if( len == 0 )
  70. {
  71. close( conn_fd );
  72. break;
  73. }
  74. else if( len < 0 )
  75. {
  76. printf("Read error... : %d\n", errno);
  77. unlink( FILE );
  78. close( conn_fd );
  79. close( listen_fd );
  80. exit( EXIT_FAILURE );
  81. }
  82. else
  83. {
  84. len = strlen( recv );
  85. recv[len] = '\0';
  86. write( conn_fd, recv, strlen( recv ) );
  87. }
  88. }
  89. }
  90. unlink( FILE );
  91. close( conn_fd );
  92. close( listen_fd );
  93. return 0;
  94. }
Copyright © Linux教程網 All Rights Reserved