一般在我們自己的主機上通信的時候,前面也講到過可以使用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, FILE, sizeof( 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;
- }