原文链接:https://blog.csdn.net/zhangkun2609/article/details/84188465

一. 功能

用于同一台主机间的进程间通讯(IPC)。

二. 特点

  1. 不需要经过网络协议栈。
  2. 不需要打包拆包、计算校验和、维护序列号应答等。
  3. 只是将应用层数据从一个进程拷贝到另一个进程。
  4. 全双工通信。

三. 模式

  1. SOCKET_DGRAM:支持数据报(固定最大长度的无连接,不可靠消息),数据报超过最大长度,会被截断。
  2. SOCKET_STREAM:提供有序,可靠的双向连接字节流。可以支持带外数据传输机制,无论多大的数据都不会截断。

四. 使用方式

  1. 调用socket()创建一个socket文件描述符, 它唯一标识一个socket。
  2. address family指定为AF_UNIX。
  3. type可以选择SOCK_DGRAM或SOCK_STREAM。
  4. protocol参数指定为0。

五. 与网络socket区别

  1. 地址格式不同,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 */
};

六. 服务端与客户端

  1. 服务端:socket()->bind()->listen()->accept()->recv()/send()->close()
  2. 客户端: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相关推荐

  1. Another MySQL daemon already running with the same unix socket的解决

    问题出现: 每周一需要备份一次数据库,即从服务器MySQL导出sql文件,再导入到我机器上虚拟机的MySQL里.但是今天早上连不上,我进入控制台用#service mysqld start强行启动,报 ...

  2. memcache多语言unix socket访问

    unix socket文件目录: /usr/local/memcache/socket php访问示例: $m = new Memcached(); $ret = $m->addServer(' ...

  3. Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差别

    Nginx连接fastcgi的方式有2种:unix domain socket和TCP,Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进 ...

  4. ubuntu下面解决mysqld_safe Directory '/var/run/mysqld' for UNIX socket file don't exists

    事情是这样的,原先创建MySQL中的root用户,指定的host为localhost,就想改一下为某个网段的,结果改完之后就退出了,然后就悲剧了,无法连接了.网上找的大部分解决办法是: ubuntu下 ...

  5. mysql启动报错:Another MySQL daemon already running with the same unix socket.

    [root@localhost ~]#/etc/init.d/mysqld restart Stopping mysqld:                                       ...

  6. Can‘t start server : Bind on unix socket: Address already in use

    文章目录 问题定位: mysql的端口3306, 已经运行了一个mysq服务端占用3306,再次运行就会出现这个问题Can't start server : Bind on unix socket: ...

  7. 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 ...

  8. another mysql daemon_MySQL错误Another MySQL daemon already running with the same unix socket.

    安装Cacti的过程中配置了数据库,但由于是在虚拟机里做的,习惯性的关机直接是Force off硬关机,刚配置完的cacti在我非正常关机重起后出现了问题,问题如下: [root@server2 ~] ...

  9. eBPF BCC 实现UNIX socket抓包

    在之前,我写了一个<eBPF bpftrace 实现个UNIX socket抓包试试>,但是很受限啊,不能完整打印包数据信息,今天又写了一个BCC的,感觉没问题了. 不多说,直接上代码: ...

  10. eBPF bpftrace 实现个UNIX socket抓包试试

    https://github.com/Rtoax/test/tree/master/bpf/bpftrace/study #!/usr/bin/bpftrace// 荣涛 // UNIX socket ...

最新文章

  1. Java Socket实战之一:单线程通信
  2. uc浏览器为什么安装在c盘_你肯定不知道为什么Windows上面的软件都想把自己安装在C盘...
  3. 文巾解题 leetcode1442. 形成两个异或相等数组的三元组数目
  4. asp.netcore oracle,Asp.net core 3.1+EF Core2.2.6+Oracle.EntityFrameworkCore2.1.19连接Oracle数据库...
  5. 人工智能第二课:认知服务和机器人框架探秘
  6. webpack最新版本_webpack小结-开发环境构建优化
  7. vuex 源码分析_前端入门之(vuex-router-sync解析)
  8. 的setinterval函数_ES6 极简教程 lt;6gt; 函数扩展
  9. 人脸方向学习(十三):Face Tracking-人脸跟踪KCF解读
  10. python怎么读取dat类型文件_基于python批量处理dat文件及科学计算方法详解
  11. java 最新Xss攻击与防护(全方位360°详解)
  12. AD15如何更新原理图库
  13. 信息安全管理体系--文件的等级划分
  14. 美区苹果id关闭双重认证_双重认证
  15. 图文教你选择和区别A卡和N卡
  16. 人工智能架构图和产业链构成
  17. 全局获取Context的技巧
  18. 百度入股星美 BAT搅动影院市场
  19. WordPress 元老 Alex King 逝世
  20. 嵌入式系统概述2-嵌入式系统组成和应用

热门文章

  1. 什么是专利申请号、专利号、公开号?
  2. coinbase交易
  3. 分享一个ai写论文的网站
  4. 水族箱泵市场深度研究分析报告
  5. 东软JavaWeb实训记-DAY8-小组项目开发实践(文件上传下载等操作)
  6. 简述电子计算机的用途和特点_计算机作业答案
  7. 日期问题:根据某用户的出生日期和当前日期,计算出他最近的生日,主要是闰月的处理
  8. supesite标签调用参数详解
  9. [转]格式塔心理学5项法则的学习与思考
  10. c++用递归法将一个整数n转换成字符串