UNIX domain ( UNIX 预协议 ) 实例

一般在我们自己的主机上通信的时候,前面也讲到过可以使用pipe,fifo,msg,共享内存之类,如果你想使用套接字的话,当然TCP/IP的套接字也是可以的,只要指定server的IP = 127.0.0.1 或者你的当前主机的实际接入网络的IP也是可以的!但是相对与此处的UNIX domain来说,在效率上可能会低一点点、、、

UNIX domain的实际操作和前面的TCP/IP中的实际的操作的框架流程是差不多的!只是其中的细节的变化要注意!

代码贴下:

server端:

/*      在主机之间的通信可以使用TCP/IP套接字进行通信,      但是在实现的效率上是不如UNIX DOMAIN的,所以      此处看看这个协议的处理!            其实实际操作中我们可以知道,与TCP/IP的操作流程      是差不多的!只是在一些细节上的变化!  */      #include <stdio.h>    #include <stdlib.h>    #include <errno.h>    #include <string.h>    #include <sys/types.h>    #include <sys/socket.h>    #include <sys/un.h>       #define     FILE            "UNIX_DOMAIN"       //!> 有点像FIFO中的文件是吧,呵呵    #define     MAXSIZE     1024    #define     MAXBACK 100       int main( int argc, char ** argv )   {       int         listen_fd;       int         conn_fd;       int         len;       char    recv[MAXSIZE];       struct sockaddr_un  servaddr;       struct sockaddr_un  childaddr;          unlink( FILE );         //!> 保证么有已经存在的文件           //!> establish the socket            //!>         if( ( listen_fd  = socket( AF_UNIX, SOCK_STREAM, 0 ) ) == -1 )       {           printf("Socket error : %d\n", errno);           exit( EXIT_FAILURE );       }              servaddr.sun_family=AF_UNIX;        //!> UNIX DOMAIN            strncpy( servaddr.sun_path, FILEsizeof( servaddr.sun_path ) - 1 );  //!> FILE                   //!> 绑定            //!>        if( bind( listen_fd, ( struct sockaddr * )&servaddr, sizeof( servaddr ) ) == -1 )       {           printf("Bind Error : %d\n", errno);           close( listen_fd );           unlink( FILE );           exit( EXIT_FAILURE );       }              //!> 监听        //!>        if( listen( listen_fd, MAXBACK ) == -1 )       {           printf("Listen error : %d\n", errno);           close( listen_fd );           unlink( FILE );           exit( EXIT_FAILURE );       }              len = sizeof( childaddr );          while( 1 )       {           //!> accept : 你懂得~            if( ( conn_fd = accept( listen_fd, ( struct sockaddr *)&childaddr, &len ) ) == -1 )           {               printf("Accept Error : %d\n", errno);               close( listen_fd );               unlink( FILE );               exit( EXIT_FAILURE );           }                      while( 1 )              //!> 可能连续读一个套接口上的内容!            {               memset( recv, 0, sizeof( recv ) );                     len = read( conn_fd, recv, sizeof( recv ) );                  if( len == 0 )               {                   close( conn_fd );                   break;               }               else if( len < 0 )               {                   printf("Read error...  : %d\n", errno);                   unlink( FILE );                   close( conn_fd );                   close( listen_fd );                   exit( EXIT_FAILURE );               }               else               {                   len = strlen( recv );                   recv[len] = '\0';                                      write( conn_fd, recv, strlen( recv ) );               }           }                      }          unlink( FILE );       close( conn_fd );       close( listen_fd );          return 0;   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://127.0.0.1/wywygx.html