博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux IPC udp/tcp/UNIX域 socket编程
阅读量:6395 次
发布时间:2019-06-23

本文共 2695 字,大约阅读时间需要 8 分钟。

UNIX域套接字本地通信即在socket第一个参数中选择AF_LOCAL,socket是BSD提出的一种适用于所有的情况的进程间通信的方式,虽然现在多用于网络通信,但是本机内的进程间通信也是没有问题的,使用socket机制的UNIX域常用在前台进程和后台进程的通信。VS tcp/ip和udp/ip的socket在CS两端使用的读写sockfd函数不同,在UNIX域下,CS两端都使用read()/write()对socket进行读写。

模型

1022162-20161014210703859-1836348892.png

#include 
#include
#include
//服务器: socket() //创建socket struct sockaddr_in //准备通信sock文件 bind() //绑定socket和addrwrite()/read() //进行通信 close() //关闭socket //客户端:socket() //创建socket//准备通信地址:服务器准备的sock文件connect() //链接socket和通信地址write()/read() //进行通信close() //关闭socket

socket()

//创建网络端点,返回socket文件描述符,失败返回-1设errnoint socket(int domain, int type, int protocol);

domain :协议族(protocol family)(网络通讯(IP)还是本地通讯(xxx.socket))

  • AF_LOCAL本地通讯/AF_UNIX/

type :协议

  • SOCK_STREAM //流式套接字, 实现包括但不限于TCP协议,which is有序,可靠双向面向连接的字节流通信方式
  • SOCK_DGRAM //数据报套接字, 实现包括但不限于UDP协议, which is不可靠,无连接的数据报通信方式

protocol: 特殊协议, 一般给0

准备通信地址:

struct sockaddr{    //主要用于函数的形参类型, 很少定义结构体变量使用, 叫做通用的通信地址类型//$man bind    sa_family_t     sa_family;    char            sa_data[14];}struct sockaddr_un{ //准备本地通信的通信地址   //$man un.h    sa_family_t     sun_family;//协议族,就是socket()的domain的AF_LOCAL    char            sun_path[];//文件的路径}

bind()

//把通信地址和socket文件描述符绑定,用在服务器端,成功返回0,失败返回-1设errnoint bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())

addr: 需要强制类型转换成socketaddr_un或soketaddr_in, 参见上
addrlen: 通信地址的大小, 使用sizeof();

connect():

//初始化一个socket的连接,用在客户端,成功返回0,失败返回-1设errnoint connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())

addr: 需要强制类型转换成socketaddr_un或soketaddr_in, 参见上
addrlen: 通信地址的大小, 使用sizeof();

例子

//UNIX域数据报socket进程间通信#include
#include
#include
#include
#include
#include
#include
int main(){ //1. create socket int sockfd=socket(AF_LOCAL,SOCK_DGRAM,0); if(-1==sockfd) perror("socket"),exit(-1); printf("create socket successfully\n"); //2. prepare communication addr struct sockaddr_un addr; addr.sun_family=AF_LOCAL; strcpy(addr.sun_path,"a.sock"); //会自动创建a.sock文件 //3. bind socket and addr int res=bind(sockfd,(struct sockaddr*)&addr,sizeof(addr)); //客户端是connect() if(-1==res) perror("bind"),exit(-1); printf("bind successfully\n"); //4. communicate char buf[100]={0}; res=read(sockfd,&buf,sizeof(buf)); //客户端是write() if(-1==res) perror("read"),exit(-1); printf("data sent by client:%s,size is %d\n",buf,sizeof(buf)); //5. close socket res=close(sockfd); if(-1==res) perror("close"),exit(-1); printf("close successfully\n"); return 0;}

转载地址:http://gnoha.baihongyu.com/

你可能感兴趣的文章
"大数据"相关专业人才受欢迎数据架构师薪酬最高
查看>>
江苏:发力物联网 产业成矩阵
查看>>
CIA真是无孔不入 2012年起它们就开始通过路由器搞监控了
查看>>
Java 基础DAY 02
查看>>
印度发生史上最大规模数据外泄,1亿多用户数据被曝光
查看>>
IBM发布面向大数据及非结构化工作负载的DeepFlash 150全闪存存储
查看>>
云计算体验与成本双赢背后:需平衡集约、分布部署
查看>>
大数据背景下谋划检务公开
查看>>
KBQA: 基于开放域知识库上的QA系统 | 每周一起读
查看>>
大数据司法时代的立言、立功与立德
查看>>
AI往银行业渗透,被“自动化”代替的从业者将流向何方?
查看>>
用户、巨头、计算平台,最终都是“社交”的傀儡?
查看>>
11招教你做好ERP系统维护
查看>>
《Android应用开发攻略》——2.9 简单的手电筒应用程序
查看>>
增加公有云费用的五个潜在成本
查看>>
华为在美国市场遭遇“多事之秋”
查看>>
2017物联网5个不可不知的关键趋势
查看>>
韩国:以网络为基础打造的无缝移动连接型智慧城市
查看>>
红帽凭借业内最广泛的解决方案发挥Linux容器的能力
查看>>
淮南:发力“大数据”能源城激活新动能
查看>>