Unix Socket
原文链接:https://blog.csdn.net/zhangkun2609/article/details/84188465
一. 功能
用于同一台主机间的进程间通讯(IPC)。
二. 特点
- 不需要经过网络协议栈。
- 不需要打包拆包、计算校验和、维护序列号应答等。
- 只是将应用层数据从一个进程拷贝到另一个进程。
- 全双工通信。
三. 模式
- SOCKET_DGRAM:支持数据报(固定最大长度的无连接,不可靠消息),数据报超过最大长度,会被截断。
- SOCKET_STREAM:提供有序,可靠的双向连接字节流。可以支持带外数据传输机制,无论多大的数据都不会截断。
四. 使用方式
- 调用socket()创建一个socket文件描述符, 它唯一标识一个socket。
- address family指定为AF_UNIX。
- type可以选择SOCK_DGRAM或SOCK_STREAM。
- protocol参数指定为0。
五. 与网络socket区别
- 地址格式不同,UNIX socket用结构体sockaddr_un表示,是一个socket类型的文件在文件系统中的路径,这个socket文件由bind()调用创建,如果调用bind()时该文件已经存在,则bind()错误返回;网络编程的socket地址是IP地址加端口号。
struct sockaddr_un {sa_family_t sun_family; /* AF_UNIX */char sun_path[UNIX_PATH_MAX]; /* pathname */
};
六. 服务端与客户端
- 服务端:socket()->bind()->listen()->accept()->recv()/send()->close()
- 客户端:socket()->connect()->recv()/send()->close()
// 创建socket
int socket(int domain, int type, int protocol)
domain(域) : AF_UNIX
type : SOCK_STREAM/ SOCK_DGRAM :
protocol : 0// 获取到socket文件描述符后,将其绑定到一个文件上。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd : 传入sock的文件描述符
addr : 用sockaddr_un表示
addrlen : 结构体长度// 监听客户端的连接
int listen(int sockfd, int backlog);
sockfd : 文件描述符
backlog : 连接队列的长度// 接受客户端的连接
// Unix domain socket不存在客户端地址的问题,因此这里的addr和addrlen参数可以设置为NULL
int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);
七. 示例程序
server端程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/un.h>
#include<errno.h>
#include<stddef.h>
#include<unistd.h>#define MAX_CONNECT_NUM 2
#define BUFFER_SIZE 1024
const char *filename="uds-tmp";int main()
{int fd,new_fd,len,i;struct sockaddr_un un;fd = socket(AF_UNIX,SOCK_STREAM,0);if(fd < 0){printf("Request socket failed!\n");return -1;}un.sun_family = AF_UNIX;unlink(filename);strcpy(un.sun_path,filename);if(bind(fd,(struct sockaddr *)&un,sizeof(un)) <0 ){printf("bind failed!\n");return -1;}if(listen(fd,MAX_CONNECT_NUM) < 0){printf("listen failed!\n");return -1;}while(1){struct sockaddr_un client_addr;char buffer[BUFFER_SIZE];bzero(buffer,BUFFER_SIZE);len = sizeof(client_addr);//new_fd = accept(fd,(struct sockaddr *)&client_addr,&len);new_fd = accept(fd,NULL,NULL);if(new_fd < 0){printf("accept failed\n");return -1;}int ret = recv(new_fd,buffer,BUFFER_SIZE,0);if(ret < 0){printf("recv failed\n");}for(i=0; i<10; i++){printf(" %d",buffer[i]);}close(new_fd);break;}close(fd);
}
client端程序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/un.h>
#include<errno.h>
#include<stddef.h>
#include<unistd.h>
#define BUFFER_SIZE 1024
const char *filename="uds-tmp";int main()
{struct sockaddr_un un;int sock_fd;char buffer[BUFFER_SIZE] = {1,2,3};un.sun_family = AF_UNIX;strcpy(un.sun_path,filename);sock_fd = socket(AF_UNIX,SOCK_STREAM,0);if(sock_fd < 0){printf("Request socket failed\n");return -1;}if(connect(sock_fd,(struct sockaddr *)&un,sizeof(un)) < 0){printf("connect socket failed\n");return -1;}send(sock_fd,buffer,BUFFER_SIZE,0);close(sock_fd);return 0;
}
Unix Socket相关推荐
- Another MySQL daemon already running with the same unix socket的解决
问题出现: 每周一需要备份一次数据库,即从服务器MySQL导出sql文件,再导入到我机器上虚拟机的MySQL里.但是今天早上连不上,我进入控制台用#service mysqld start强行启动,报 ...
- memcache多语言unix socket访问
unix socket文件目录: /usr/local/memcache/socket php访问示例: $m = new Memcached(); $ret = $m->addServer(' ...
- Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差别
Nginx连接fastcgi的方式有2种:unix domain socket和TCP,Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进 ...
- ubuntu下面解决mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists
事情是这样的,原先创建MySQL中的root用户,指定的host为localhost,就想改一下为某个网段的,结果改完之后就退出了,然后就悲剧了,无法连接了.网上找的大部分解决办法是: ubuntu下 ...
- mysql启动报错:Another MySQL daemon already running with the same unix socket.
[root@localhost ~]#/etc/init.d/mysqld restart Stopping mysqld: ...
- Can‘t start server : Bind on unix socket: Address already in use
文章目录 问题定位: mysql的端口3306, 已经运行了一个mysq服务端占用3306,再次运行就会出现这个问题Can't start server : Bind on unix socket: ...
- MySQL不能启动 Can't start server : Bind on unix socket: Permission denied
[问题描述] MySQL不能启动 Can't start server : Bind on unix socket: Permission denied [解决方案] 查看my.cnf文件,找到.so ...
- another mysql daemon_MySQL错误Another MySQL daemon already running with the same unix socket.
安装Cacti的过程中配置了数据库,但由于是在虚拟机里做的,习惯性的关机直接是Force off硬关机,刚配置完的cacti在我非正常关机重起后出现了问题,问题如下: [root@server2 ~] ...
- eBPF BCC 实现UNIX socket抓包
在之前,我写了一个<eBPF bpftrace 实现个UNIX socket抓包试试>,但是很受限啊,不能完整打印包数据信息,今天又写了一个BCC的,感觉没问题了. 不多说,直接上代码: ...
- eBPF bpftrace 实现个UNIX socket抓包试试
https://github.com/Rtoax/test/tree/master/bpf/bpftrace/study #!/usr/bin/bpftrace// 荣涛 // UNIX socket ...
最新文章
- Java Socket实战之一:单线程通信
- uc浏览器为什么安装在c盘_你肯定不知道为什么Windows上面的软件都想把自己安装在C盘...
- 文巾解题 leetcode1442. 形成两个异或相等数组的三元组数目
- asp.netcore oracle,Asp.net core 3.1+EF Core2.2.6+Oracle.EntityFrameworkCore2.1.19连接Oracle数据库...
- 人工智能第二课:认知服务和机器人框架探秘
- webpack最新版本_webpack小结-开发环境构建优化
- vuex 源码分析_前端入门之(vuex-router-sync解析)
- 的setinterval函数_ES6 极简教程 lt;6gt; 函数扩展
- 人脸方向学习(十三):Face Tracking-人脸跟踪KCF解读
- python怎么读取dat类型文件_基于python批量处理dat文件及科学计算方法详解
- java 最新Xss攻击与防护(全方位360°详解)
- AD15如何更新原理图库
- 信息安全管理体系--文件的等级划分
- 美区苹果id关闭双重认证_双重认证
- 图文教你选择和区别A卡和N卡
- 人工智能架构图和产业链构成
- 全局获取Context的技巧
- 百度入股星美 BAT搅动影院市场
- WordPress 元老 Alex King 逝世
- 嵌入式系统概述2-嵌入式系统组成和应用