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本地套接字通信相关推荐

  1. linux 本地套接字 路径,linux本地套接字

    本地套接字实现的是同一主机的不同进程间的通信,且建立的通信是双向的通信.socket本地通信与网络通信使用的是统一套接口,只是地址结构中的参数不同. 1.socket流程 (1)创建socket 创建 ...

  2. 本地套接字示例[来源:Advanced Linux Programming]

    本地套接字示例[来源:Advanced Linux Programming] 要通过套接字连接同一台主机上的进程,可以使用符号常量 PF_LOCAL 和 PF_UNIX所代表的本地命名空间.它们被称为 ...

  3. [转]UDP(udp通信、广播、组播),本地套接字

    转发参考链接: [陈宸-研究僧] https://blog.csdn.net/qq_35883464/article/details/103741461 [Alliswell_WP] https:// ...

  4. Linux网络编程——Unix本地套接字

    概述 今天给大家讲解网络编程中的一个内容--Unix 本地套接字. 发现很多人不知道或者不太了解 Unix 本地套接字这个概念,这也难怪,socket API 原本就是为多台主机之间网络通信设计的,并 ...

  5. linux编程本地套接字

    linux编程本地套接字 本地套接字是 IPC,也就是本地进程间通信的一种实现方式.除了本地套接字以外,其它技术,诸如管道.共享消息队列等也是进程间通信的常用方法,但因为本地套接字开发便捷,接受度高, ...

  6. c/c++:UDP(udp通信、广播、组播),本地套接字

    目录 1. udp 1.1 udp通信流程 1.2 操作函数 send.sendto recv.recvfrom 2. 广播 2.1 广播通信流程 2.2 设置广播属性函数:setsockopt 2. ...

  7. 本地套接字(domain)通信

    本地套接字(domain)通信 socket IPC 对比网络套接字 本地套接字实现通信 通信流程 服务端程序 客户端程序 运行结果 socket IPC   socket API原本是为网络通讯设计 ...

  8. linux的基础知识——本地套接字

    1.本地套接字

  9. Linux套接字编程之sockaddr与sockaddr_in网络套接字,sockaddr_un进程间通信本地套接字

    sockaddr struct sockaddr { unsigned  short  sa_family;     /* address family, AF_xxx */ char  sa_dat ...

最新文章

  1. Adobe Audition CC 2020中文版
  2. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1088:分离整数的各个数
  3. Flutter之Decoration
  4. Leetcode刷题(4)罗马数字转整数
  5. 神龙X-Dragon,这技术“范儿”如何?| 问底中国IT技术演进
  6. 文件上传存至oracle,fileupload上传文件存储到oracle Blob字段中
  7. 偏微分方程的正问题和逆问题(inverse problem)
  8. Python 3 实现插入排序
  9. CAD转GIS工具软件下载
  10. 图像处理 灰度世界算法
  11. 微信小程序清除缓存(ios和安卓的解决方法)
  12. Vs code 进行硬件设计实用插件-语法高亮、语法检查、自动例化、Testbench生成、对齐、代码块等
  13. 找回win10自带的windows照片查看器
  14. 无法登录苹果开发者_如何申请苹果开发者帐号?有哪些注意事项?
  15. XAI Explainable AI 模型可解释性(3)
  16. 使用async批量获取博客链接
  17. MySQL主从复制之realy_log_recovery
  18. #includeiomanip中的iomanip的一些用法
  19. 算法题之创造新世界(动态规划)
  20. UEFI无法进入WIN10的系统?BIOS找不到ssd硬盘?reboot and select proper boot device的另一种解决思路

热门文章

  1. 前端实现在邮件内图片添加超链接的问题
  2. heapanalyzer分析内存
  3. android 吧荣耀游戏下载地址,荣耀战歌下载_荣耀战歌安卓正版下载_游戏吧
  4. 5个优秀的设计网站,我不允许你不知道
  5. 【数据挖掘技术应用笔记】
  6. 第一章 概述与第一个程序
  7. React中的Hooks详解
  8. 黑武器linux下载地址,酷毙了!暗黑版 Arch,BlackArch Linux 2017.03.01发布
  9. MC9S12XEP100 ADC模块使用总结
  10. 微信小程序:2048小游戏