linux客户服务端ipc,Linux下Socket通信(IPC)

本文介绍了Linux下Socket通信的基本原理,包括通信模式、创建步骤及关键函数的使用方法,并提供了两个简单的示例程序来演示如何使用Socket进行进程间通信。

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

2、Socket是一种进程间通信模式:

对等模式(P2P):一对一:UDP

客户服务器模式(C/S):一对多:TCP

3、基本创建步骤

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

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

(3)进行读写操作read/recv/recvfrom write/send/sendto

(4)close方法关闭套接字

4、下面是其中用到的一些函数的用法及说明

(1)socket函数

int socket(int domain,int type, int protocol)

domain:地址族 IF_INET与底层内核通信(原生数据包)

type:通信的数据格式

protocol:传递数的含义

通信的数据类型:

SOCK_STREAM:字节流(一对多)

SOCK_DGRAM:字节包(一对一)

SOCK_RAW:硬件层的原生数据包

通信的协议:

0:默认协议:地址族+数据格式=唯一决定协议

指定协议 IPPROTO_TCP

IPPROTO_UDP

IPPROTO_IP

IPPROTO_ICMP

IPPROTO_IGMP

(2)bind函数

把socket绑定到一个通信地址

int bind(int sockfd,const struct sockaddr* addr,socklen_t len)

sockfd:绑定地址的socket

addr:地址

len:地址内存长度

返回:成功是0,失败是-1

(3)recvfrom函数

如果想返回数据发送者的地址,则使用recvfrom.

int recvfrom(int fd,

void *buf,

size_t len,

int flag,

struct sockaddr*addr,//返回数据发送者的地址) ssocklen_t *l);//输入返回地址缓冲长度,返回实际发送者的地址长度

(4)write/send/sendto函数

int sendto(int fd,//发送socket

const void *buf,//发送的数据

size_t len,//发送数据的长度

int flag,//发送数据的方式,建议为0

const struct sockaddr *addr,//数据        发往的目的地址

socklen_t l);//地址长度

返回:

-1:发送失败

否则就是发送的字节数。

代码如下:

test1.c

#include

#include

#include

#include

#include

int main(void)

{

//create socket

int fd = socket(AF_INET, SOCK_DGRAM, 0);

if(fd==-1)

{

perror("socket\n");

exit(-1);

}

printf("socket fd=%d\n",fd);

//build connection address

struct sockaddr_in addr;

addr.sin_family = AF_INET;

addr.sin_port = htons(6666);

addr.sin_addr.s_addr = inet_addr("127.0.0.1");

int r;

r = bind(fd,(struct sockaddr*)&addr,sizeof(addr));

if(r==-1)

{

perror("bind");

close(fd);

exit(-1);

}

printf("bind address successful!\n");

//accept or send message

char buf[255];

struct sockaddr_in from;

socklen_t len;

len = sizeof(from);

while(1)

{

r = recvfrom(fd,buf,sizeof(buf)-1,0,(struct sockaddr*)&from,&len);

if(r>0)

{

buf[r]=0;

printf("The message from %s is:%s\n",inet_ntoa(from.sin_addr),buf);

}

else

{

break;

}

}

//close socket

close(fd);

return 0;

}

test2.c

#include

#include

#include

#include

#include

#include

#include

int main(void)

{

//create socket

int fd = socket(AF_INET,SOCK_DGRAM,0);

if(fd==-1)

{

perror("socket");

exit(-1);

}

printf("create socket OK!\n");

//create an send address

struct sockaddr_in addr={};

addr.sin_family = AF_INET;

addr.sin_port = htons(6666);

addr.sin_addr.s_addr=inet_addr("127.0.0.1");

//send the message to the specify address

int r;

char buf[255];

while(1)

{

r = read(0,buf,sizeof(buf)-1);

if(r<=0)

break;

sendto(fd,buf,r,0,(struct sockaddr*)&addr,sizeof(addr));

}

//close socket

close(fd);

return 0;

}

运行结果如下:(先运行test1.o,然后运行test2.o,在test2.c运行后输入内容,在test1.c所在终端中就会显示信息)

d0cb99d0c2d03f2df12784787aeb1a73.png

1352bf1331a3f55235ba04311eea141a.png

以下是一些好的博客:http://blog.sina.com.cn/s/blog_48d101870100n7e9.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值