歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

UNIX domain ( UNIX 預協議 ) 實例

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