Linux本地套接字通信
1. 本地套接字
socket API原本为网络通信而设计,后来在其基础上扩展出本地套接字机制用于本地进程间通信。
本地套接字为全双工通信方式。
2. 本地套接字的使用
2.1 本地套接字通信步骤
(1)创建本地socket
本地套接字使用文件来标识,该文件在绑定之前不能存在,因为会自动创建。
(2)绑定
(3)监听
(4)提取
(5)读写
(6)关闭
2.2 创建本地套接字API
(1)socket创建本地套接字
int socket(int domain, int type, int protocol);
/*
参数:domain:AF_UNIXtype:SOCK_STREAM 或 SOCK_DGRAMprotocol:0
返回值:成功:文件描述符失败:-1
*/
(2)bind绑定
int bind(int sockfd, const struct sockaddr* addr, socklen_t addrlen)
/*
参数:sockfd:本地套接字文件描述符;addr:本地套接字结构体;#include<sys/un.h>struct sockaddr_un {sa_family sun_family; // 直接写AF_UNIXchar sun_path[108]; // 文件路径名}addrlen:本地套接字结构体长度
*/
3. 本地套接字实现TCP通信
服务器端:
#include<stdio.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<string.h>
#include<stddef.h>
#include<unistd.h>/*本地套接字实现TCP服务器*/
int main(int argc, const char* argv[]) {unlink("sock.s");// 1.创建本地流式套接字int lfd = socket(AF_UNIX, SOCK_STREAM, 0);// 2.绑定struct sockaddr_un myaddr;myaddr.sun_family = AF_UNIX;strcpy(myaddr.sun_path, "sock.s");int len = offsetof(struct sockaddr_un, sun_path) + strlen(myaddr.sun_path);bind(lfd, (struct sockaddr*)&myaddr, len);// 3.监听listen(lfd, 128);// 4.提取struct sockaddr_un cliaddr;socklen_t len_c = sizeof(cliaddr);int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &len_c);printf("new client filepath: %s\n", cliaddr.sun_path);// 5.读写char buf[1500] = "";while (1) {int n = recv(cfd, buf, 1500, 0);if (n < 0) {printf("err or closed.\n");break;} else {printf("%s\n", buf);send(cfd, buf, n, 0);}}// 6.关闭close(cfd);close(lfd);return 0;
}
使用nc命令测试的运行结果:
注意:客户端可以隐式绑定,但服务器不可以。因为nc命令为隐式绑定,因此该结果无法打印文件路径。
客户端:
#include<stdio.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<stddef.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>int main(int argc, const char* argv[]) {unlink("sock.c");// 1.创建本地流式套接字int cfd = socket(AF_UNIX, SOCK_STREAM, 0);// 2.绑定。若客户端不绑定,则为隐式绑定struct sockaddr_un myaddr;myaddr.sun_family = AF_UNIX;strcpy(myaddr.sun_path, "sock.c");if (bind(cfd, (struct sockaddr*)&myaddr, sizeof(myaddr)) < 0) {perror("bind");return 1;}// 2.连接struct sockaddr_un servaddr;servaddr.sun_family = AF_UNIX;strcpy(servaddr.sun_path, "sock.s");connect(cfd, (struct sockaddr*)&servaddr, sizeof(servaddr));// 3.读写while (1) {char buf[1500] = "";int n = read(STDIN_FILENO, buf, 1500);send(cfd, buf, n, 0);memset(buf, 0, 1500);n = recv(cfd, buf, 1500, 0);if (n <= 0) {printf("err or closed.\n");break;} else {printf("%s\n", buf);}}// 4.关闭close(cfd);return 0;
}
客户端、服务端通信,运行结果:
Linux本地套接字通信相关推荐
- linux 本地套接字 路径,linux本地套接字
本地套接字实现的是同一主机的不同进程间的通信,且建立的通信是双向的通信.socket本地通信与网络通信使用的是统一套接口,只是地址结构中的参数不同. 1.socket流程 (1)创建socket 创建 ...
- 本地套接字示例[来源:Advanced Linux Programming]
本地套接字示例[来源:Advanced Linux Programming] 要通过套接字连接同一台主机上的进程,可以使用符号常量 PF_LOCAL 和 PF_UNIX所代表的本地命名空间.它们被称为 ...
- [转]UDP(udp通信、广播、组播),本地套接字
转发参考链接: [陈宸-研究僧] https://blog.csdn.net/qq_35883464/article/details/103741461 [Alliswell_WP] https:// ...
- Linux网络编程——Unix本地套接字
概述 今天给大家讲解网络编程中的一个内容--Unix 本地套接字. 发现很多人不知道或者不太了解 Unix 本地套接字这个概念,这也难怪,socket API 原本就是为多台主机之间网络通信设计的,并 ...
- linux编程本地套接字
linux编程本地套接字 本地套接字是 IPC,也就是本地进程间通信的一种实现方式.除了本地套接字以外,其它技术,诸如管道.共享消息队列等也是进程间通信的常用方法,但因为本地套接字开发便捷,接受度高, ...
- c/c++:UDP(udp通信、广播、组播),本地套接字
目录 1. udp 1.1 udp通信流程 1.2 操作函数 send.sendto recv.recvfrom 2. 广播 2.1 广播通信流程 2.2 设置广播属性函数:setsockopt 2. ...
- 本地套接字(domain)通信
本地套接字(domain)通信 socket IPC 对比网络套接字 本地套接字实现通信 通信流程 服务端程序 客户端程序 运行结果 socket IPC socket API原本是为网络通讯设计 ...
- linux的基础知识——本地套接字
1.本地套接字
- Linux套接字编程之sockaddr与sockaddr_in网络套接字,sockaddr_un进程间通信本地套接字
sockaddr struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_dat ...
最新文章
- Adobe Audition CC 2020中文版
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1088:分离整数的各个数
- Flutter之Decoration
- Leetcode刷题(4)罗马数字转整数
- 神龙X-Dragon,这技术“范儿”如何?| 问底中国IT技术演进
- 文件上传存至oracle,fileupload上传文件存储到oracle Blob字段中
- 偏微分方程的正问题和逆问题(inverse problem)
- Python 3 实现插入排序
- CAD转GIS工具软件下载
- 图像处理 灰度世界算法
- 微信小程序清除缓存(ios和安卓的解决方法)
- Vs code 进行硬件设计实用插件-语法高亮、语法检查、自动例化、Testbench生成、对齐、代码块等
- 找回win10自带的windows照片查看器
- 无法登录苹果开发者_如何申请苹果开发者帐号?有哪些注意事项?
- XAI Explainable AI 模型可解释性(3)
- 使用async批量获取博客链接
- MySQL主从复制之realy_log_recovery
- #includeiomanip中的iomanip的一些用法
- 算法题之创造新世界(动态规划)
- UEFI无法进入WIN10的系统?BIOS找不到ssd硬盘?reboot and select proper boot device的另一种解决思路