Linux网络编程(7)本地套接字通信

2023-10-27

**TCP本地套接字通信:**为了实现没有血缘关系的进程之间通信,通常会采用本地套接字进行通信,在两个进程分别绑定好了套接字文件(.sock),运行程序后将产生两个套接字文件,这两个文件共享同一片内核缓冲区,内核将完成两个进程之间的数据传输

在这里插入图片描述
在不同通信中采用不同的结构体
在这里插入图片描述

实现流程(TCP实现)
服务器
1.创建套接字
int lfd = socket(AF_LOCAL,SOCK_STREAM,0);

2.绑定
struct sockaddr_un serv;
serv.sun_family = af_local;
strcpy(serv.sun_path,“server.socket”);
bind(lfd,(struct sockaddr*)&serv,len);

3.设置监听
listen();

4.等待接收连接请求
struct sockaddr_un client;
int len = sizeof(client);
int cfd = accept(lfd,&client,&len);

5.通信
发送数据:send
接收数据:recv

6.断开连接
close(cfd);
close(lfd);

客户端
1.创建套接字
int fd =socket(af_local,sock_stream,0);

2.绑定套接字文件
struct sockaddr_un client;
client.sun_family = af_local;
strcpy(client.sun_path,“client.socket”);
bind(fd,(strcut sockaddr*)&client,len);

3.建立连接
struct sockaddr_un serv;
serv.sun_family = af_local;
strcpy(serv.sun_path,“server.soket”);
connetc(fd,&serv,sizeof(server));

4.通信
发送数据:send();
接收数据:recv();

5.关闭连接
close(fd);

完整代码
服务器

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/un.h>

int main(int argc, const char* argv[])
{
    int lfd = socket(AF_LOCAL, SOCK_STREAM, 0);
    if(lfd == -1)
    {
        perror("socket error");
        exit(1);
    }

    // 如果套接字文件存在, 删除套接字文件
    unlink("server.sock");

    // 绑定
    struct sockaddr_un serv;
    serv.sun_family = AF_LOCAL;
    strcpy(serv.sun_path, "server.sock");
    int ret = bind(lfd, (struct sockaddr*)&serv, sizeof(serv));
    if(ret == -1)
    {
        perror("bind error");
        exit(1);
    }
     
    // 监听
    ret = listen(lfd, 36);
    if(ret == -1)
    {
        perror("listen error");
        exit(1);
    }

    // 等待接收连接请求
    struct sockaddr_un client;
    socklen_t len = sizeof(client);
    int cfd = accept(lfd, (struct sockaddr*)&client, &len);
    if(cfd == -1)
    {
        perror("accept error");
        exit(1);
    }
    printf("======client bind file: %s\n", client.sun_path);
     
    // 通信
    while(1)
    {
        char buf[1024] = {0};
        int recvlen = recv(cfd, buf, sizeof(buf), 0);
        if(recvlen == -1)
        {
            perror("recv error");
            exit(1);
        }
        else if(recvlen == 0)
        {
            printf("clietn disconnect ....\n");
            close(cfd);
            break;
        }
        else
        {
            printf("recv buf: %s\n", buf);
            send(cfd, buf, recvlen, 0);
        }
    }
    close(cfd);
    close(lfd);
    
    return 0;
}

客户端

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/un.h>

int main(int argc, const char* argv[])
{
    int fd = socket(AF_LOCAL, SOCK_STREAM, 0);
    if(fd == -1)
    {
        perror("socket error");
        exit(1);
    }

    unlink("client.sock");

    // ================================
    // 给客户端绑定一个套接字文件
    struct sockaddr_un client;
    client.sun_family = AF_LOCAL;
    strcpy(client.sun_path, "client.sock");
    int ret = bind(fd, (struct sockaddr*)&client, sizeof(client));
    if(ret == -1)
    {
        perror("bind error");
        exit(1);
    }

    // 初始化server信息
    struct sockaddr_un serv;
    serv.sun_family = AF_LOCAL;
    strcpy(serv.sun_path, "server.sock");

    // 连接服务器
    connect(fd, (struct sockaddr*)&serv, sizeof(serv));

    // 通信
    while(1)
    {
        char buf[1024] = {0};
        fgets(buf, sizeof(buf), stdin);
        send(fd, buf, strlen(buf)+1, 0);

        // 接收数据
        recv(fd, buf, sizeof(buf), 0);
        printf("recv buf: %s\n", buf);
    }

    close(fd);

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux网络编程(7)本地套接字通信 的相关文章

随机推荐

  • Jenkins:报错Build step ‘Execute Windows batch command‘ marked build as failure解决办法

    Windows 下本地的 Jenkins 部署完成后 创建任务进行构建时 遇到如下报错信息 构建虽然失败了 但是命令却是执行成功了 问题就在于 Build step Execute Windows batch command marked
  • 数字媒体资产管理教材

    http vr sdu edu cn lulin course DAM
  • 产量预测文献读后整理

    文献名称 1 Data Driven End To End Production Prediction of Oil Reservoirs by EnKF Enhanced Recurrent Neural Networks 2 Produ
  • TensorFlow实现简单神经网络

    本文首发于我的个人博客QIMING INFO 转载请带上链接及署名 在上文 TensorFlow快速上手 中 我们介绍了TensorFlow中的一些基本概念 并实现了一个线性回归的例子 本文我们趁热打铁 接着用TensorFlow实现一下神
  • 前端强缓存和协商缓存

    缓存是前端面试的一个常见知识点 下面对于实际项目中如何进行缓存的设置给出方案 强缓存和协商缓存 浏览器缓存是浏览器将用户请求过的静态资源存储到电脑本地磁盘中 当再次访问时 就可以直接从本地缓存中加载而不需要去向服务器请求了 但是缓存也有缺点
  • C++内存泄露检测器(库注入方法)

    C 内存泄露检测器 库注入方法 2012 06 18 15 55 04 分类 C C codeproject上的一篇文章 翻译过来共享 C Memory Leak Finder C 内存泄露检测器 leakfinder zip 作者 Fre
  • GPT专业应用:早晚安问候语生成

    正文共 725 字 阅读大约需要 3 分钟 社群运营必备技巧 您将在3分钟后获得以下超能力 自动生成早晚安问候语 Beezy评级 B级 经过简单的寻找 大部分人能立刻掌握 主要节省时间 推荐人 nanako 编辑者 Linda 此图片由Le
  • 【Java 微服务架构 Dubbo篇】-1-Zookeeper

    课程回顾 微服务架构需要解决的问题 分布式协调框架Zookeeper 什么是分布式协调技术 分布式协调技术主要用来解决分布式环境当中多个进程之间的同步控制 让他们有序的去访问某种临界资源 防止造成 脏数据 的后果 在这图中有三台机器 每台机
  • LSTM神经网络详解

    LSTM 长短时记忆网络 Long Short Term Memory Network LSTM 是一种改进之后的循环神经网络 可以解决RNN无法处理长距离的依赖的问题 目前比较流行 长短时记忆网络的思路 原始 RNN 的隐藏层只有一个状态
  • Java学习笔记(02_1Java语言基础)

    知识点总结于毕向东Java基础视频教程25天版本 侵权请联系删除 第二章 Java语言基础 Java语言基础组成 关键字 标识符 注释 常量与变量 常量 变量 类型转换 运算符 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 三元
  • ajax后台返回的数据为空前台显示出现undefined的解决方法

    之前自己做的一个图书管理系统 显示图书借阅排行榜 因为翻译在数据库中有为空的字段 故前台显示会显示undefined 以下贴上部门代码 document ready function rankTable tbody html var id
  • chromium源码的下载与编译

    这篇文章主要记录在chromium源码下载以及编译过程中遇到的问题 一直都对chromium的源码感兴趣 在没有封闭外网之前 下载了一个版本 很老了 重新进行更新又不得行 再加上公司的产品线路需要了解chromium的相关知识 又加上疫情封
  • Ctfshow web入门 PHP特性篇 web89-web151 全

    web入门 PHP特性篇的wp都一把梭哈在这里啦 有点多 师傅们可以收藏下来慢慢看 写的应该挺全面的叭 有错误敬请斧正 CTFshow PHP web89 看题目 有个flag php文件 题目要求get有个num 是数字但是不包含0 9
  • 吴恩达深度学习笔记-单层神经网络(第2课)

    深度学习笔记 1 神经网络概览 2 神经网络表示 3 计算神经网络的输出 4 多个样本的向量化 5 向量化实现的解释 6 激活函数 7 为什么需要非线性激活函数 8 激活函数的导数 9 神经网络的梯度下降法 10 直观理解反向传播 11 随
  • SQL-万能密码

    打开目标站点 随便输入用户名密码 查看返回结果 提示错误 后台管理http 10 225 91 25 知识点 这题需要用到万能密码 首先了解一下万能密码 一般的 库验证登录注册查询数据会用到以下的句型 如果用户名与密码匹配正确则返回真值通过
  • Webpack配置

    Webpack 文章目录 Webpack 一 Webpack的基本功能 二 Webpack的核心概念 三 Webpack常用的Loader 四 Webpack常见的Plugins 五 Loader和Plugin的区别 以及如何自定义Load
  • Ehcache是现在最流行的纯Java开源缓存框架

    Ehcache是现在最流行的纯Java开源缓存框架 配置简单 结构清晰 功能强大 最初知道它 是从Hibernate的缓存开始的 网上中文的EhCache材料以简单介绍和配置方法居多 如果你有这方面的问题 请自行google 对于API 官
  • java枚举和数值的相互转换

    枚举简介 enum 的全称为 enumeration 是 JDK 1 5 中引入的新特性 存放在 java lang 包中 在实际编程中 往往存在着这样的 数据集 它们的数值在程序中是稳定的 而且 数据集 中的元素是有限的 此时枚举可以很方
  • BH1750 光照传感器文档详解 及 驱动设计

    前言 最近接触到一个应用 需要在低功耗的产品上加上光照度采集 正好最近有接触到一款光照传感器 BH1750 性能价格都合适 那么今天就抽空来好好测试一下 那么要写一篇测试文章 我会尽量以新手的角度从资料的获取 资料的阅读理解 以及根据资料进
  • Linux网络编程(7)本地套接字通信

    TCP本地套接字通信 为了实现没有血缘关系的进程之间通信 通常会采用本地套接字进行通信 在两个进程分别绑定好了套接字文件 sock 运行程序后将产生两个套接字文件 这两个文件共享同一片内核缓冲区 内核将完成两个进程之间的数据传输 在不同通信