一般在我们自己的主机上通信的时候,前面也讲到过可以使用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;
}
cilent端:
#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" //!> 其实作用有点像PORT不是吗,:-)
#define MAXSIZE 1024
int main( int argc, char ** argv )
{
int conn_fd;
int i_index;
int len;
char send_recv[MAXSIZE];
struct sockaddr_un servaddr;
if( ( conn_fd = socket( AF_UNIX, SOCK_STREAM, 0 ) ) == -1 )
{
printf("Socket Error... %d\n", errno);
exit( EXIT_FAILURE );
}
servaddr.sun_family = AF_UNIX;
strcpy(servaddr.sun_path, FILE );
//!> connect
//!>
if( connect( conn_fd, ( struct sockaddr * )&servaddr, sizeof( servaddr ) ) == -1 )
{
printf("Connect Error... : %d\n", errno);
close( conn_fd );
exit( EXIT_FAILURE );
}
i_index = 0;
while( 1 )
{
memset( send_recv, 0, sizeof( send_recv ) ); //!> 注意此步需要
sprintf(send_recv, "Client Send : %d\n", i_index++);
write( conn_fd, send_recv, strlen( send_recv ) ); //!> 写数据
sleep( 1 );
memset( send_recv, 0, sizeof( send_recv ) );
len = read( conn_fd, send_recv, sizeof( send_recv ) ); //!> 读数据
if( len > 0 )
{
printf("Client Get ---> %s\n", send_recv);
}
sleep( 1 );
}
close( conn_fd );
return 0;
}
编译与运行:
gcc -o server server.c
gcc -o client client.c
./server ( 可以使用后台& )
./client
好了这个代码比较简单,就不说什么了~