Linux本地套接字通信

news2024/9/25 3:23:50

1. 本地套接字

        socket API原本为网络通信而设计,后来在其基础上扩展出本地套接字机制用于本地进程间通信。

        本地套接字为全双工通信方式。


2. 本地套接字的使用

本地套接字通信步骤

        (1)创建本地socket

                本地套接字使用文件来标识,该文件在绑定之前不能存在,因为会自动创建。

        (2)绑定

        (3)监听

        (4)提取

        (5)读写

        (6)关闭

创建本地套接字API

(1)socket创建本地套接字

int socket(int domain, int type, int protocol);
/*
参数:
    domain:AF_UNIX
    type:SOCK_STREAM 或 SOCK_DGRAM
    protocol: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_UNIX
            char 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;
}

客户端、服务端通信,运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JUC基础】04. Lock锁

1、前言 java.util.concurrent.locks为锁定和等待条件提供一个框架的接口和类&#xff0c;说白了就是锁所在的包。 2、什么是Lock Lock是一种锁机制&#xff0c;比同步块&#xff08;synchronized block&#xff09;更加灵活&#xff0c;同时也更加复杂的线程同步机制。在JDK…

Node.js,多环境配置

目录 1、多环境简介 2、多环境配置 3、命令运行 1、多环境简介 在前端项目的开发过程中&#xff0c;我们需要把项目发布到不同服务器环境中&#xff0c;例如&#xff0c;测试&#xff0c;生产&#xff0c;开发&#xff0c;预生产等环境。在这个我们需要对不同的环境设置不同…

函数的运用

函数的运用 一、函数的定义二、简单函数实验两个数字的运算&#xff1a;调用位置变量函数变量的作用范围 三、函数的递归阶乘递归目录 四、函数库 一、函数的定义 shell函数是经常使用的&#xff0c;因为有些命令序列是需要反复调用执行的&#xff0c;将命令序列按格式写在一起…

三分钟教你Mac下安装VmWare虚拟机

大数据课程课前环境准备&#xff1a;mac中安装三台linux服务器 一、课前准备 准备一台内存最少8G&#xff08;建议16G&#xff09;、cpu i7 4核的电脑 二、课堂主题 安装虚拟化软件VMware准备3台linux虚拟机 三、课堂目标 完成mac下3个虚拟机的安装 四、知识要点 文档说…

洗稿用什么软件-洗稿软件免费

洗稿文章的主要优势 洗稿文章的主要优势在于提高文章的质量和效率。以下是洗稿文章的几个主要优势&#xff1a; 优化结构和语言 洗稿可以删除冗余、无用和重复的内容&#xff0c;同时对文章的结构和语言进行优化&#xff0c;提高文章的可读性和吸引力。这可以使文章更加专业…

探索自然语言处理领域的最新进展与挑战

自然语言处理&#xff08;NLP&#xff09;是人工智能领域中最受关注的领域之一&#xff0c;它涉及计算机和人类语言之间的交互。NLP的应用范围非常广泛&#xff0c;包括机器翻译、语音识别、文本分类、情感分析等等。本文将介绍NLP的基本概念和入门知识&#xff0c;以帮助初学者…

一键安装k8s脚本

服务器配置 节点(华为云服务器)配置master 2vCPUs | 4GiB | s6.large.2 CentOS 7.8 64bit node1 2vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bit node2 2vCPUs | 8GiB | s6.large.4 CentOS 7.8 64bit 1.master节点安装脚本&#xff1a;install_k8s_master.sh。 sh文件上传到…

Windows基于Docker安装Elasticsearch和 kibana笔记

Windows基于Docker安装Elasticsearch和 kibana笔记 一、Windows安装Docker1、Windows安装Docker要求2、Docker安装 二、基于Docker安装Elasticsearch1、安装Elasticsearch2、Elasticsearch的XPACK验证2.1、什么是Xpack2.2、Xpack相关安全配置介绍2.2.1、xpack.security.enabled…

系统分析师之系统测试与维护(十六)

目录 一、 测试与评审 1.1 测试类型 1.2 测试阶段 1.3 面向对象的测试 1.4 测试自动化 1.5 软件调试 1.6 软件评审 1.7 验收与确认 二、软件质量管理 2.1 软件过程改进-CMMI 2.2 软件开发环境与工具 三、系统运行与评价 3.1 系统转换计划 3.1.1 遗留系统演化策略…

C++——C/C++内存管理

0.关注博主有更多知识 C知识合集 目录 1.C/C内存分布 2.C内存管理方式 2.1new和delete操作内置类型 2.2new和delete对自定义类型操作 2.3new和delete一定要配套使用 2.4new和malloc对错误的处理方式 3.operator new和operator delete函数 3.1new和delete的实现原理 …

如何实现PLC为主站的开关量自组网无线通信?

本方案是基于Modbus RTU协议下实现的1主多从自组网无线通信形式&#xff0c;主站为S7-1200 PLC&#xff0c;DTD433H作为从站。DTD433H具备输入和输出开关量信号功能&#xff0c;信号传输方向由用户原系统主从设备所实现的功能决定。方案中采用无线开关量信号测控终端DTD433H与欧…

JAVA+SpringBoot框架+SaaS模式云HIS源码

HIS分系统&#xff08;HIS子系统&#xff09; 1、医院业务子系统功能 ▶门诊医生站主模块&#xff1a;包括门诊业务、家庭医生、公共卫生、医疗协同等子模块 &#xff08;1&#xff09;门诊业务功能简介&#xff1a; ①统计门诊收费明细、用药情况&#xff1b; ②可管理患…

UOS获取ROOT权限

UOS获取ROOT权限 1. 设置里可以看到开发者选项2. 设置里无法看到开发者选项 1. 设置里可以看到开发者选项 这个就按照网上的流程申请就好了 2. 设置里无法看到开发者选项 一般而言就是系统被修改过了&#xff0c;或者定制化了&#xff0c;可以通过下载一个uos的正常镜像来获…

维也纳国际酒店11家门店陆续开业,加速布局中高端酒店市场

2023年&#xff0c;中国旅游业迎来飞速复苏。据弗若斯特沙利文报告预计&#xff0c;2021至2025年&#xff0c;中高端连锁酒店将是整个酒店行业增长最快的细分市场。如何抓住市场复苏和行业增长双重机遇&#xff0c;成为酒店投资者和从业者面临的重要课题。 过去几年里&#xff…

基础语法——笔记一

一、基础语法 编码 源码文件以UTF-8编码&#xff0c;所有字符串都是Unicode字符串标识符 第一个字符必须是字母表中的字母或下划线_ 标识符的其他部分由字母、数字、下划线组成 标识符对大小写敏感python保留字&#xff08;关键字&#xff09; 不能用于任何标识符输出python标…

【Redis高级应用】多级缓存

文章目录 什么是多级缓存JVM进程缓存初识Caffeine实现JVM进程缓存需求实现 Lua语法入门初识LuaHelloWorld变量和循环Lua的数据类型声明变量循环 条件控制、函数函数条件控制案例 实现多级缓存安装OpenRestyOpenResty快速入门反向代理流程OpenResty监听请求编写item.lua 请求参数…

ES+Redis+MySQL,这个高可用架构设计太顶了

会员系统是一种基础系统&#xff0c;跟公司所有业务线的下单主流程密切相关。如果会员系统出故障&#xff0c;会导致用户无法下单&#xff0c;影响范围是全公司所有业务线。所以&#xff0c;会员系统必须保证高性能、高可用&#xff0c;提供稳定、高效的基础服务。 一、背景 二…

【最终截稿 | Springer 独立出版 | EI稳定检索】 2023年绿色建筑国际会议(ICoGB 2023)

会议简介 Brief Introduction 2023年绿色建筑国际会议(ICoGB 2023) 会议时间&#xff1a;2023年5月21日-23日 召开地点&#xff1a;瑞典斯德哥尔摩 大会官网&#xff1a;www.icogb.org ICoGB 2023将围绕“绿色建筑”的最新研究领域而展开&#xff0c;为研究人员、工程师、专家学…

进程(一)

进程&#xff08;一&#xff09; 2.1 进程的定义、组成、组织方式、特征2.1.1 定义2.1.2 组成2.1.3 组织方式2.1.4 特征2.1.5 本小节总结 2.2 进程的状态与转换2.2.1 进程的状态2.2.3 进程状态的转换2.2.4 本小节总结 2.3 进程控制2.3.1 基本概念2.3.2 进程控制相关的原语2.3.3…

BetaFlight Mark4之“妖怪”声音

BetaFlight Mark4之“妖怪”声音 1. 源由2. 分析3. 数据3.1 配置一3.1.1 “妖怪”声音 黑匣子分析 3.2 配置二3.2.1 仅配置调整&#xff08;其他不变&#xff09;3.2.2 配置调整 整体螺丝锁紧 4. 总结5. 附录5.1 Betaflight filter tuning. The easy way to get a perfect fil…