进程间通信方法三:本地套接字domain

2023-05-16

代码中注释已写的很详细,就不多言了

注意事项

  1. 保证套接字文件在同一个目录下
  2. 网络套接字与本地套接字使用的结构体不同
    • 网络套接字采用的结构体为struct sockaddr_in
    • 本地套接字采用的结构体为struct sockaddr_un

服务端

  • offsetof宏函数原型
    • #define offsetof(type,member) ((int)&((type*)0)->MEMBER
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stddef.h>
#include <sys/un.h>
#include <unistd.h>
#include <ctype.h>

#define SERVFILENAME "/home/server.socket"

int main()
{
    //本地套接字不需要tcp或udp,但第2个参数需要随便给一个
    int sfd = socket(AF_UNIX,SOCK_STREAM,0);

    struct sockaddr_un serv_addr;
    bzero(&serv_addr,sizeof (serv_addr));
    serv_addr.sun_family = AF_UNIX;
    strcpy(serv_addr.sun_path,SERVFILENAME);

    /*offsetof是一个宏函数,第二个参数是第一个参数的成员,用来计算第二个参数在第一个参数中的偏移位置;
    struct sockaddr_un结构体一共就两个成员,一个AF_UNIX和一个sun_path;
    offsetof函数计算出AF_UNIX的长度,加上sun_path的长度,求得的len就是sockaddr_un的有效文件名长度,如果用sizeof求的话是整个结构体空间长度*/
    int len = offsetof(struct sockaddr_un,sun_path)+strlen(serv_addr.sun_path);

    //unlink函数可以删除一个文件,或者一个目录项
    //bind调用后会创建一个套接字文件(此处名为SERVFILENAME),如果调用之前套接字文件已经存在,那么bind会出错
    unlink(SERVFILENAME);
    bind(sfd,(struct sockaddr*)&serv_addr,len);//此处会创建SERVFILENAME文件,且第三个参数不能写sizeof(serv_addr)

    listen(sfd,20);

    struct sockaddr_un clie_addr;
    printf("accept..........\n");
    int readlen = 0;
    char buf[BUFSIZ];
    while (1) {
        len = sizeof (clie_addr);//此处len为clie_addr长度
        int cfd = accept(sfd,(struct sockaddr*)&clie_addr,(socklen_t*)&len);//传入传出参数,此处len为客户端的struct sockaddr_un大小
        len -= offsetof(struct sockaddr_un,sun_path);//相当于减去了结构体中第一个成员的长度,得到的是客户端文件名大小
        clie_addr.sun_path[len] = '\0';//客户段也使用strlen求的长度,没有'\0'结束标记,手动加上,防止打印出错

        printf("bind client file name:%s\n",clie_addr.sun_path);

        while((readlen = read(cfd,buf,sizeof (buf))) > 0){
            for(int i = 0; i < readlen; i++){
                buf[i] = toupper(buf[i]);
            }
            write(cfd,buf,readlen);
            memset(buf,0,sizeof (buf));
        }
        close(cfd);
    }
    close(sfd);
    return 0;
}

客户端

#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/un.h>
#include <ctype.h>
#include <stddef.h>
#define SERVFILENAME "/home/server.socket"
#define CLIEFILENAME "/home/client.socket"

int main()
{
    int cfd = socket(AF_UNIX,SOCK_STREAM,0);

    struct sockaddr_un clie_addr;
    bzero(&clie_addr,sizeof (clie_addr));
    strcpy(clie_addr.sun_path,CLIEFILENAME);
    clie_addr.sun_family = AF_UNIX;
    //计算客户端地址有效长度
    int len = offsetof(struct sockaddr_un,sun_path) + strlen(clie_addr.sun_path);
    unlink(CLIEFILENAME);
    //客户端也需要绑定,不能依赖自动绑定,需要指定套接字文件
    bind(cfd,(struct sockaddr*)&clie_addr,len);

	//构造server地址    
    struct sockaddr_un serv_addr;
    bzero(&serv_addr,sizeof (serv_addr));
    serv_addr.sun_family = AF_UNIX;
    strcpy(serv_addr.sun_path,SERVFILENAME);
    //计算服务器端地址有效长度
    len = offsetof(struct sockaddr_un,sun_path) + strlen(serv_addr.sun_path);
    connect(cfd,(struct sockaddr*)&serv_addr,len);//此处为传入参数

    char buf[BUFSIZ];
    memset(buf,0,sizeof (buf));
    while(fgets(buf,sizeof (buf),stdin) != NULL){
        write(cfd,buf,strlen(buf));
        memset(buf,0,sizeof (buf));
        len = read(cfd,buf,sizeof (buf));
        write(STDOUT_FILENO,buf,len);
        memset(buf,0,sizeof (buf));
    }
    close(cfd);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程间通信方法三:本地套接字domain 的相关文章

  • 进程间通信方法三:本地套接字domain

    代码中注释已写的很详细 xff0c 就不多言了 注意事项 保证套接字文件在同一个目录下网络套接字与本地套接字使用的结构体不同 网络套接字采用的结构体为struct sockaddr in本地套接字采用的结构体为struct sockaddr
  • AMD IOMMU与Linux (4) -- Domain, Group, Device

    1 domain的本质是一个页表 xff0c 1对1的关系 2 IOMMU DOMAIN UNMANAGED vs IOMMU DOMAIN DMA a IOMMU DOMAIN UNMANAGED DMA mappings managed
  • 参数“{0}”不能是空字符串。 cookie.Domain

    参数 0 不能是空字符串 cookie Domain client cc Add new Cookie 34 Referrer 34 34 34 今天在添加cookie容器添加COOKIE时 xff0c 提示了 参数 0 不能是空字符串 c
  • 域(Domain)

    1 Domain 2 内网环境 工作组 xff1a 默认模式 xff0c 人人平等 xff0c 不方便管理 域 xff0c 人人不平等 xff0c 集中管理 xff0c 同一管理 3 xff1a 集中 统一管理 4 域的特点域组成 控制器D
  • UDA/语义分割-ColorMapGAN: Unsupervised Domain Adaptation for Semantic Segmentation Using Color Mapping G

    ColorMapGAN Unsupervised Domain Adaptation for Semantic Segmentation Using Color Mapping Generative Adversarial Networks
  • Linux下WRF Domain Wizard使用教程(PART2: 使用教程及 遇到的种种BUG)

    当用命令run DomainWizard打开WRFDW后 如图所示 第一步 第一栏是你的虚拟机的名称 第二栏是WPS所在的目录 第三行是WPS所需要的静态地理数据的位置 第四栏是你WRFDW项目存放的位置 这里我新创建了个domain 点击
  • Unable to run app in Simulator(Domain = LaunchServicesErrror, Code = 0)

    NSArray paths 5 61 NSSearchPathForDirectoriesInDomains NSLibraryDirectory NSUserDomainMask YES Users hkqj Library Develo
  • socket函数的domain、type、protocol解析

    socket 函数的 domain type protocol 解析 lxg 64 2015 04 09 内核中的 socket 概览 图一 xff1a socket 概览 内核中套接字是一层一层进行抽象展示的 xff0c 把共性的东西抽取
  • FreeSWITCH 架构

    从来章开始 我们正式开始我们的 FreeSWITCH 之旅 今后我们不再用单独的章节来讲述VoIP中的其它要素和概念 而是在用到时穿插于各个章节之中 总体结构 FreeSWITCH 由一个稳定的核心及外围模块组成 下图来自 FreeSWIT
  • JAVA的extends用法

    理解继承是理解面向对象程序设计的关键 在Java中 通过关键字extends继承一个已有的类 被继承的类称为父类 超类 基类 新的类称为子类 派生类 在Java中不允许多继承 1 继承 class Animal void eat Syste
  • PF_INET AF_INET

    在写网络程序的时候 建立TCP socket sock socket PF INET SOCK STREAM 0 然后再绑定本地地址或连接远程地址时需要初始化sockaddr in结构 其中指定address family时一般设置问AF
  • 通用组、全局组、本地域组的区别

    1 本地域组 多域用户访问单域资源 访问同一个域 本地域组的成员可包括Windows Server2003 Windows 2000或WindowsNT域中的其他组和账户 而且只能在其所在域内指派权限 2 全局组 单域用户访问多域资源 必须
  • 重定向http://www.domain.com到http://domain.com

    Make your site Class B Sep 3 2003 Class B means that all of the traffic to http www yourdomain com is politely and silen
  • ARM MMU工作原理剖析

    一 MMU的产生 许多年以前 当人们还在使用DOS或是更古老的操作系统的时候 计算机的内存还非常小 一般都是以K为单位进行计算 相应的 当时的程序规模也不大 所以内存容量虽然小 但还是可以容纳当时的程序 但随着图形界面的兴起还用用户需求的不
  • Tomcat 目录列表···webloigc 目录列表···Weblogic修改端口号

    Tomcat web xml
  • ordfilt2函数功能说明

    转自 http www ilovematlab cn thread 91331 1 1 html ordfilt2函数在MATLAB图像处理工具箱中提供了二维统计顺序滤波函数ordfilt2函数 二维统计顺序滤波是中值滤波的推广 对于给定的
  • 细说业务逻辑(后篇)

    细说业务逻辑 后篇 作者 EricZhang T2噬菌体 来源 博客园 时间 2009 11 01 阅读 295 次 原文链接 收藏 前篇 http kb cnblogs com page 50470 3 业务逻辑的架构模式及实现 Mart
  • kvm环境快照(snapshot)的使用方法

    实例一 使用qemu img命令使用快照 kvm环境下qcow2的镜像支持快照 1 确认镜像的格式 root nc1 boss qemu img info test qcow2 image test qcow2 file format qc
  • Active Directory的基本认识

    参考文献 http edu yesky com edupxpt 379 2086379 shtml http en wikipedia org wiki Active Directory Active Directory 和我们熟悉的网络邻
  • 如何快速增加大量用户和用户组

    Windows平台下 假设建有Domain A和Domain B 两者已经建立了信任关系 可以采用在命令行中输入如下命令在各自的domain中增加用户或用户组 1 增加用户组FOR L i in 1 1 10 DO dsadd group

随机推荐