本地套接字(domain)
本地套接字是一种特殊类型的套接字,和 TCP/UDP 套接字不同。TCP/UDP 即使在本地地址通信,也要走系统网络协议栈,而本地套接字,严格意义上说提供了一种单主机跨进程间调用的手段,减少了协议栈实现的复杂度,效率比 TCP/UDP 套接字都要高许多。本地套接字是 IPC,也就是本地进程间通信的一种实现方式。
本地套接字的作用: 本地的进程间通信
可以实现 有关系的进程间的通信 和 没有关系的进程间的通信
本地套接字实现流程和网络套接字类似,一般采用TCP的通信流程。
地址结构对比(本地对比网络)
struct sockaddr_in {
__kernel_sa_family_t sin_family; /* Address family */ 地址结构类型
__be16 sin_port; /* Port number */ 端口号
struct in_addr sin_addr; /* Internet address */ IP地址
};struct sockaddr_un {
__kernel_sa_family_t sun_family; /* AF_UNIX */ 地址结构类型
char sun_path[UNIX_PATH_MAX]; /* pathname */ socket文件名(含路径)
};
编程思想对比(本地对比网络)
本地套接字—进程间通信流程
服务器端
1. 创建监听的套接字
int lfd = socket(af_local, sock_stream, 0);
第一个参数: AF_UNIX, AF_LOCAL2. 监听的套接字绑定本地的 套接字文件-> server端
struct sockaddr_un addr;
// 绑定成功之后, 指定的sun_path中的套接字文件会自动生成
bind(lfd, addr, len);3. 监听
listen(lfd, 100);4. 等待并接受连接请求
struct sockaddr_un cliaddr;
int connfd = accept(lfd, cliaddr, len);5. 通信
接收数据: read/recv
发送数据: write/send6. 关闭连接
close();
客户端
1. 创建通信的套接字
int fd = socket(af_local, sock_stream, 0);2. 监听的套接字绑定本地的IP 端口
struct sockaddr_un addr;
// 绑定成功之后, 指定的sun_path中的套接字文件会自动生成
bind(fd, addr, len);3. 连接服务器
struct sockaddr_un serveraddr;
connect(fd, serveraddr, sizeof(serveraddr));4. 通信
接收数据: read/recv
发送数据: write/send5. 关闭连接
代码实现
/* server.c */
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <stddef.h>#include "wrap.h"#define SERV_ADDR "serv.socket"int main(void)
{int lfd, cfd, len, size, i;struct sockaddr_un servaddr, cliaddr;char buf[4096];lfd = Socket(AF_UNIX, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sun_family = AF_UNIX;strcpy(servaddr.sun_path, SERV_ADDR);len = offsetof(struct sockaddr_un, sun_path) + strlen(servaddr.sun_path); /* servaddr total len */unlink(SERV_ADDR); /* 确保bind之前serv.sock文件不存在,bind会创建该文件 */Bind(lfd, (struct sockaddr *)&servaddr, len); /* 参3不能是sizeof(servaddr) */Listen(lfd, 20);printf("Accept ...\n");while (1) {len = sizeof(cliaddr); //AF_UNIX大小+108Bcfd = Accept(lfd, (struct sockaddr *)&cliaddr, (socklen_t *)&len);len -= offsetof(struct sockaddr_un, sun_path); /* 得到文件名的长度 */cliaddr.sun_path[len] = '\0'; /* 确保打印时,没有乱码出现 */printf("client bind filename %s\n", cliaddr.sun_path);while ((size = read(cfd, buf, sizeof(buf))) > 0) {for (i = 0; i < size; i++)buf[i] = toupper(buf[i]);write(cfd, buf, size);}close(cfd);}close(lfd);return 0;
}
/* client.c */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <strings.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <stddef.h>#include "wrap.h"#define SERV_ADDR "serv.socket"
#define CLIE_ADDR "clie.socket"int main(void)
{int cfd, len;struct sockaddr_un servaddr, cliaddr;char buf[4096];cfd = Socket(AF_UNIX, SOCK_STREAM, 0);bzero(&cliaddr, sizeof(cliaddr));cliaddr.sun_family = AF_UNIX;strcpy(cliaddr.sun_path,CLIE_ADDR);len = offsetof(struct sockaddr_un, sun_path) + strlen(cliaddr.sun_path); /* 计算客户端地址结构有效长度 */unlink(CLIE_ADDR);Bind(cfd, (struct sockaddr *)&cliaddr, len); /* 客户端也需要bind, 不能依赖自动绑定*/bzero(&servaddr, sizeof(servaddr)); /* 构造server 地址 */servaddr.sun_family = AF_UNIX;strcpy(servaddr.sun_path, SERV_ADDR);len = offsetof(struct sockaddr_un, sun_path) + strlen(servaddr.sun_path); /* 计算服务器端地址结构有效长度 */Connect(cfd, (struct sockaddr *)&servaddr, len);while (fgets(buf, sizeof(buf), stdin) != NULL) {write(cfd, buf, strlen(buf));len = read(cfd, buf, sizeof(buf));write(STDOUT_FILENO, buf, len);}close(cfd);return 0;
}
本地套接字(domain)相关推荐
- 本地套接字(domain)通信
本地套接字(domain)通信 socket IPC 对比网络套接字 本地套接字实现通信 通信流程 服务端程序 客户端程序 运行结果 socket IPC socket API原本是为网络通讯设计 ...
- Linux网络编程——Unix本地套接字
概述 今天给大家讲解网络编程中的一个内容--Unix 本地套接字. 发现很多人不知道或者不太了解 Unix 本地套接字这个概念,这也难怪,socket API 原本就是为多台主机之间网络通信设计的,并 ...
- linux 本地套接字 路径,linux本地套接字
本地套接字实现的是同一主机的不同进程间的通信,且建立的通信是双向的通信.socket本地通信与网络通信使用的是统一套接口,只是地址结构中的参数不同. 1.socket流程 (1)创建socket 创建 ...
- Linux本地套接字通信
1. 本地套接字 socket API原本为网络通信而设计,后来在其基础上扩展出本地套接字机制用于本地进程间通信. 本地套接字为全双工通信方式. 2. 本地套接字的使用 2.1 本地套接字通信步骤 ( ...
- 本地套接字示例[来源:Advanced Linux Programming]
本地套接字示例[来源:Advanced Linux Programming] 要通过套接字连接同一台主机上的进程,可以使用符号常量 PF_LOCAL 和 PF_UNIX所代表的本地命名空间.它们被称为 ...
- linux的基础知识——本地套接字
1.本地套接字
- tomcat套接字接受失败_07 | What? 还有本地套接字?
很多人都知道 TCP 和 UDP,但是对本地套接字却不甚了解. 实际上,本地套接字是 IPC,也就是本地进程间通信的一种实现方式.除了本地套接字以外,其它技术,诸如管道.共享消息队列等也是进程间通信的 ...
- Linux套接字编程之sockaddr与sockaddr_in网络套接字,sockaddr_un进程间通信本地套接字
sockaddr struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_dat ...
- linux编程本地套接字
linux编程本地套接字 本地套接字是 IPC,也就是本地进程间通信的一种实现方式.除了本地套接字以外,其它技术,诸如管道.共享消息队列等也是进程间通信的常用方法,但因为本地套接字开发便捷,接受度高, ...
最新文章
- 四层和七层交换技术-loadbalance
- 电机编码器调零步骤_各种编码器的调零方法
- QT,C++多项式计算器—version3(厌倦CMD黑框框的走起!)
- 机器学习系列1:单变量线性回归
- 实习笔记(数据库相关)-2014
- 【转】接口测试面试题
- 谈谈python的from __future__ import absolute_import
- vsftpd 虚拟用户详细配置
- 介绍几种常用的Oracle客户端工具
- 解决“应用程序正常初始化(0x00000005)失败”错误
- 关于dubbo的rpc基于传输层一说
- 快速实现ML302 GPS+4G发送定位信息详解
- OS1和OS2单模光纤的区别
- 大学期末考java编程题_大学慕课2020年Java程序设计期末考试大全答案
- PHP微勤,家E课 黄微勤 小学一年级作文二年级作文【写句子】百度...
- “区块链+”的真实场景数据:月活800万是极端个例 整体规模尚小
- 【angular】浏览器低版本报错,Object.assign
- HCNP-路由交换:PPPoE
- 通用mapper常用查询方法测试
- arduino教程-07.舵机
热门文章
- [论文阅读] (07) RAID2020 Cyber Threat Intelligence Modeling Based on Heterogeneous GCN
- WiFi未来趋势如何?如何搭上物联网这条大船?
- CF677C Vanya and Label
- 如何选择企业级数据存储DAS、NAS和SAN
- Redis——有时候expire比exists更好用
- 【脑洞大开】《西潮》及《走向世界丛书》
- Excel 下拉多选的设置
- C++基础知识 —— 内存分区模型、引用、函数重载、类和继承、this指针、友元、多态、文件操作
- 企业要融资,增资好还是股权转让好
- 列的完整性约束——设置表字段的外键约束(FOREIGN KEY,FK)