linux socket经典实例,linux IPC之socket解析及实例代码

Linux下的Socket通信是一种基于文件的IPC通信,也可以是基于其他设备的IPC通信。它可以在本机内不同进程间实现通信,也可以在实现不同主机之间的通信。

socket的创建步骤

服务端

1.通过socket()函数创建socket

2.通过bind函数绑定socket于设备地址

3.通过listen监听指定的socket

4.通过accept等待客户端的连接

客户端

1.通过socket()函数创建socket

2.通过connect连接到服务端

待经过上面的步骤后,服务端和客户端已经建立了链接,可以通过write/read或者sendto/recvfrom发送/接收数据.

示列

1.服务端

//s_unix.c

#include 

#include 

#include 

#include 

#define UNIX_DOMAIN "/tmp/UNIX.domain"

int main(void)

{

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;

listen_fd=socket(PF_UNIX,SOCK_STREAM,0);

if(listen_fd<0)

{

perror("cannot create communication socket");

return 1;

}

//set server addr_param

srv_addr.sun_family=AF_UNIX;

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

unlink(UNIX_DOMAIN);

//bind sockfd & addr

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;

}

//listen sockfd

ret=listen(listen_fd,1);

if(ret==-1)

{

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

close(listen_fd);

unlink(UNIX_DOMAIN);

return 1;

}

//have connect request use 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;

}

//read and printf sent client info

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;

}

2.客户端

//c_unix.c

#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;

//creat unix socket

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);

//connect server

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");

//send info server

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

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

close(connect_fd);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值