Chinaunix首页 | 论坛 | 博客
  • 博客访问: 170086
  • 博文数量: 28
  • 博客积分: 1065
  • 博客等级: 少尉
  • 技术积分: 385
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-11 13:20
文章分类

全部博文(28)

文章存档

2014年(1)

2012年(6)

2011年(19)

2010年(2)

我的朋友

分类: LINUX

2011-07-21 21:28:21

服务器端实现
程序p13.2.c为使用套接字在UNIX域内实现进程间通信的服务端程序。首先,程序通过调用socket函数,建立了监听连接的套接字,然后调用bind函数,将套接字与地址信息关联起来。调用listen函数实现对该端口的监听,当有连接请求时,通过调用accept函数建立与客户机的连接,最后,调用read函数来读取客户机发送过来的消息,当然也可以使用recv函数实现相同的功能。p13.2.c的具体代码如下:

//p13.2.c UNIX域通信代码示例,服务器端

#include

#include

#include

#include

//定义用于通信的文件名

#define UNIX_DOMAIN "/tmp/UNIX.domain"

int main()

{

socklen_t clt_addr_len;

int listen_fd;

int com_fd;

int ret;

int i;

static char recv_buf[1024];

int len;

struct sockaddr_un clt_addr;

struct sockaddr_un srv_addr;

//创建用于通信的套接字,通信域为UNIX通信域

listen_fd=socket(PF_UNIX,SOCK_STREAM,0);

if(listen_fd<0){

perror("cannot create listening socket");

return 1;

}

//设置服务器地址参数

srv_addr.sun_family=AF_UNIX;

strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);

unlink(UNIX_DOMAIN);

//绑定套接字与服务器地址信息

ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));

if(ret==-1){

perror("cannot bind server socket");

close(listen_fd);

unlink(UNIX_DOMAIN);

return 1;

}

//对套接字进行监听,判断是否有连接请求

ret=listen(listen_fd,1);

if(ret==-1){

perror("cannot listen the client connect request");

close(listen_fd);

unlink(UNIX_DOMAIN);

return 1;

}



//当有连接请求时,调用accept函数建立服务器与客户机之间的连接

len=sizeof(clt_addr);

com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);

if(com_fd<0){

perror("cannot accept client connect request");

close(listen_fd);

unlink(UNIX_DOMAIN);

return 1;

}



//读取并输出客户端发送过来的连接信息

printf("\n=====info=====\n");

for(i=0;i<4;i++){

memset(recv_buf,0,1024);

int num=read(com_fd,recv_buf,sizeof(recv_buf));

printf("Message from client (%d)) :%s\n",num,recv_buf);

}

close(com_fd);

close(listen_fd);



unlink(UNIX_DOMAIN);

return 0;

}

客户端实现
程序p13.3.c为使用套接字在UNIX域内实现进程间通信的客户端程序。相比服务端的程序,客户段较为简单。程序首先通过调用socket函数创建通信所需的套接字,然后,调用connect函数来连接服务器,在成功建立连接后,通过调用write函数向服务器发送指定的消息。p13.3.c的具体代码如下:

//p13.3.c UNIX域通信代码示例,客户端

#include

#include

#include

#include

//定义用于通信的文件名

#define UNIX_DOMAIN "/tmp/UNIX.domain"

int main(void)

{

int connect_fd;

int ret;

char snd_buf[1024];

int i;

static struct sockaddr_un srv_addr;

//创建用于通信的套接字,通信域为UNIX通信域

connect_fd=socket(PF_UNIX,SOCK_STREAM,0);

if(connect_fd<0){

perror("cannot create communication socket");

return 1;

}

srv_addr.sun_family=AF_UNIX;

strcpy(srv_addr.sun_path,UNIX_DOMAIN);

//连接服务器

ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));

if(ret==-1){

perror("cannot connect to the server");

close(connect_fd);

return 1;

}



memset(snd_buf,0,1024);

strcpy(snd_buf,"message from client");

//给服务器发送消息

for(i=0;i<4;i++)

write(connect_fd,snd_buf,sizeof(snd_buf));



close(connect_fd);

return 0;

}

阅读(2065) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~