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, 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;
- }
相关推荐
IT之家 2020-03-11
graseed 2020-10-28
zbkyumlei 2020-10-12
SXIAOYI 2020-09-16
jinhao 2020-09-07
impress 2020-08-26
liuqipao 2020-07-07
淡风wisdon大大 2020-06-06
yoohsummer 2020-06-01
chenjia00 2020-05-29
baike 2020-05-19
扭来不叫牛奶 2020-05-08
hxmilyy 2020-05-11
黎豆子 2020-05-07
xiongweiwei00 2020-04-29
Cypress 2020-04-25
冰蝶 2020-04-20