17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字
在这里插入图片描述
第1个参数domain,表示协议族,只能为AF_LOCAL或者AF_UNIX;
第2个参数type,表示类型,只能为0。
第3个参数protocol,表示协议,可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STREAM建立的套接字对是管道流,与一般的管道相区别的是,套接字对建立的通道是双向的,即每一端都可以进行读写。不管是数据流还是数据报协议,unix域套接字都是可靠的,不丢包的。
第4个参数,用于保存建立的套接字对。

示例:

#include <stdio.h>    
#include <stdlib.h>    
#include <sys/socket.h>    
#include <string.h>
#include <sys/types.h>
#include <unistd.h>int main(void)  
{    int i_fd_arr[2];    int i_pid;    char psz_wbuf[16] = "0123456789";char psz_rbuf[16] = {0};if ( socketpair( AF_UNIX, SOCK_STREAM, 0, i_fd_arr ) < 0 )  {    perror( "socketpair" );return -1;}if ( ( i_pid = fork() ) < 0 )  {    perror( "fork" );return -1;}  else if ( 0 == i_pid )  {    //child    close( i_fd_arr[0] );    if ( write( i_fd_arr[1], psz_wbuf, strlen( psz_wbuf ) ) < 0 )  {perror( "write" );exit( -1 );}memset( psz_rbuf, 0, sizeof( psz_rbuf ) );if ( read( i_fd_arr[1], psz_rbuf, 16 ) < 0 )  {perror( "read" );exit( -1 );}printf( "child read: %s\n", psz_rbuf );}else{    //parent  close( i_fd_arr[1] );  if ( read( i_fd_arr[0], psz_rbuf, 16 ) < 0 )  {perror( "read" );exit( -1 );}printf( "parent read: %s\n", psz_rbuf );memset( psz_wbuf, 0, sizeof( psz_wbuf ) );strncpy( psz_wbuf, "9876543210", sizeof( psz_wbuf ) - 1 );if ( write( i_fd_arr[0], psz_wbuf, strlen( psz_wbuf ) ) < 0 )  {perror( "write" );exit( -1 );}}return 0;    
}    

命名UNIX域套接字

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TCP示例:

server.c

#include <stdio.h>    
#include <sys/socket.h>    
#include <sys/un.h>    
#include <string.h>
#include <unistd.h>int main(void)  
{    int i_listenfd = 0, i_clientfd = 0;       struct sockaddr_un addr_server, addr_client;    char psz_path[32] = "./server_unixsocket_file";int i_caddr_len = sizeof(struct sockaddr_un); int i_saddr_len = sizeof(struct sockaddr_un);    char psz_rbuf[32] = {0};    char psz_wbuf[32] = "i am server.";int i_readlen = 0;//create a UNIX domain stream socket    if ( ( i_listenfd = socket( AF_UNIX, SOCK_STREAM, 0 ) ) < 0 )  {    perror( "socket" );return -1;}//in case it already exists    unlink( psz_path );    //fill in socket address structure    memset( &addr_server, 0, sizeof( addr_server ) );    addr_server.sun_family = AF_UNIX;strncpy( addr_server.sun_path, psz_path, sizeof( addr_server.sun_path ) - 1 );    //bind the name to the descriptorif ( bind( i_listenfd, ( struct sockaddr * )&addr_server, i_saddr_len ) < 0 )  {perror( "bind" );    return -1;    }    if ( listen( i_listenfd, 10 ) < 0 ){    perror( "listen" );return -1;}    while(1){if ( ( i_clientfd = accept( i_listenfd, ( struct sockaddr * )&addr_client,( socklen_t * )&i_caddr_len ) ) < 0 )  {    perror("accept");return -1;}    printf( "client is: %s\n", addr_client.sun_path );    if ( ( i_readlen = read( i_clientfd, psz_rbuf, sizeof( psz_rbuf ) - 1 ) ) < 0 ){perror( "read" );return -1;}psz_rbuf[i_readlen] = '\0';printf( "receive msg:%s\n", psz_rbuf );    if ( write( i_clientfd, psz_wbuf, strlen( psz_wbuf ) + 1 ) < 0 )  {    perror("write");    return -1;    }}unlink( psz_path );    return 0;    
}   

client.c

#include <stdio.h>    
#include <sys/un.h>    
#include <sys/socket.h>    
#include <string.h>
#include <unistd.h>int main(void)  
{    int i_fd = 0;    struct sockaddr_un addr;    char psz_path[32] = "./client_unixsocket_file";    char serverpath[32] = "./server_unixsocket_file";    int i_addr_len = sizeof( struct sockaddr_un );    char psz_wbuf[32] = "i am client.";char psz_rbuf[32] = {0}; int i_readlen = 0;if ( ( i_fd = socket( AF_UNIX, SOCK_STREAM, 0 ) ) < 0 )  {    perror("socket");return -1;}memset( &addr, 0, sizeof( addr ) );    addr.sun_family = AF_UNIX;strncpy( addr.sun_path, psz_path, sizeof( addr.sun_path ) - 1 );    unlink( psz_path );if ( bind( i_fd, ( struct sockaddr * )&addr, i_addr_len ) < 0 )  {    perror("bind");return -1;}//fill socket adress structure with server's address    memset( &addr, 0, sizeof( addr ) );    addr.sun_family = AF_UNIX;strncpy( addr.sun_path, serverpath, sizeof( addr.sun_path ) - 1 );    if ( connect( i_fd, ( struct sockaddr * )&addr, i_addr_len ) < 0 )  {perror("connect");return -1;}if ( write( i_fd, psz_wbuf, strlen( psz_wbuf ) + 1 ) < 0 )  {perror( "write" );    return -1;}    if ( ( i_readlen = read( i_fd, psz_rbuf, sizeof( psz_rbuf ) - 1 ) ) < 0 )  {    perror("write");    return -1;    }psz_rbuf[i_readlen] = '\0';printf( "receive msg:%s\n", psz_rbuf );    unlink( psz_path );return -1;
}    

UDP示例:
server

#include <stdio.h>      
#include <sys/socket.h>      
#include <sys/un.h>      
#include <string.h>  
#include <unistd.h>  int main(void)    
{      int i_listenfd = 0/*, i_clientfd = 0*/;         struct sockaddr_un addr_server, addr_client;      char psz_path[32] = "./server_unixsocket_file";  int i_caddr_len = sizeof(struct sockaddr_un);   int i_saddr_len = 0;      char psz_rbuf[32] = {0};      char psz_wbuf[32] = "i am server.";  int i_readlen = 0;  //create a UNIX domain stream socket      if ( ( i_listenfd = socket( AF_UNIX, SOCK_DGRAM, 0 ) ) < 0 )  {      perror( "socket" );  return -1;  }  //in case it already exists      unlink( psz_path );      //fill in socket address structure      memset( &addr_server, 0, sizeof( addr_server ) );      addr_server.sun_family = AF_UNIX;  strncpy( addr_server.sun_path, psz_path, sizeof( addr_server.sun_path ) - 1 );      //bind the name to the descriptor  i_saddr_len = strlen( addr_server.sun_path ) + sizeof( addr_server.sun_family );  if ( bind( i_listenfd, ( struct sockaddr * )&addr_server, i_saddr_len ) < 0 )    {  perror( "bind" );      return -1;      }      while(1)  {  i_readlen = recvfrom( i_listenfd, psz_rbuf, sizeof( psz_rbuf ) - 1, 0,  ( struct sockaddr * )&addr_client, ( socklen_t *)&i_caddr_len );  if ( i_readlen < 0 )  {  perror( "read" );  return -1;  }  printf( "client is: %s\n", addr_client.sun_path );psz_rbuf[i_readlen] = '\0';  printf( "receive msg:%s\n", psz_rbuf );    if ( sendto( i_listenfd, psz_wbuf, strlen( psz_wbuf ) + 1, 0,  ( struct sockaddr * )&addr_client, i_caddr_len ) < 0 )  {  perror( "write" );  return -1;  }  }  unlink( psz_path );  return 0;      
}  

Client

#include <stdio.h>    
#include <sys/un.h>    
#include <sys/socket.h>    
#include <string.h>
#include <unistd.h>int main(void)  
{    int i_fd = 0;    struct sockaddr_un addr;    char psz_clientpath[32] = "./client_unixsocket_file";    char psz_serverpath[32] = "./server_unixsocket_file";    int i_addr_len = 0;   char psz_wbuf[32] = "i am client.";char psz_rbuf[32] = {0}; int i_readlen = 0;if ( ( i_fd = socket( AF_UNIX, SOCK_DGRAM, 0 ) ) < 0 )  {    perror("socket");return -1;}memset( &addr, 0, sizeof( addr ) );    addr.sun_family = AF_UNIX;strncpy( addr.sun_path, psz_clientpath, sizeof( addr.sun_path ) - 1 );    unlink( psz_clientpath );i_addr_len = strlen( addr.sun_path ) + sizeof( addr.sun_family );if ( bind( i_fd, ( struct sockaddr * )&addr, i_addr_len ) < 0 )  {    perror("bind");return -1;}//fill socket adress structure with server's address    memset( &addr, 0, sizeof( addr ) );    addr.sun_family = AF_UNIX;strncpy( addr.sun_path, psz_serverpath, sizeof( addr.sun_path ) - 1 );    i_addr_len = strlen( addr.sun_path ) + sizeof( addr.sun_family ); if ( sendto( i_fd, psz_wbuf, strlen( psz_wbuf ) + 1, 0,( struct sockaddr * )&addr, i_addr_len ) < 0 )  {perror( "write" );    return -1;}    if ( ( i_readlen = recvfrom( i_fd, psz_rbuf, sizeof( psz_rbuf ) - 1, 0,( struct sockaddr * )&addr, ( socklen_t * )&i_addr_len ) ) < 0 )  {perror("write");    return -1;    }psz_rbuf[i_readlen] = '\0';printf( "receive msg:%s\n", psz_rbuf );    unlink( psz_clientpath );return -1;
}  

示例代码抄录自:https://blog.csdn.net/bytxl/article/details/47861469
用于加深理解

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

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

相关文章

HTTP 缓存

缓存 web缓存是可以自动保存常见的文档副本的HTTP设备&#xff0c;当web请求抵达缓存时&#xff0c;如果本地有已经缓存的副本&#xff0c;就可以从本地存储设备而不是从原始服务器中提取这个文档。使用缓存有如下的优先。 缓存减少了冗余的数据传输缓存环节了网络瓶颈的问题…

MySQL学习之InnoDB引擎,索引

Mysql中的引擎 我们先来看一下MySql提供的有哪些引擎 mysql> show engines; 从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎&#xff0c;也就是说只有 InnoDB 支持事务。 查看MySQL当前默认的存储引…

算法力扣刷题记录 五十一【654.最大二叉树】

前言 二叉树篇&#xff0c;继续。 记录 五十一【654.最大二叉树】 一、题目阅读 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。…

套接字编程一(简单的UDP网络程序)

文章目录 一、 理解源IP地址和目的IP地址二、 认识端口号1. 理解 "端口号" 和 "进程ID"2. 理解源端口号和目的端口号 三、 认识协议1. 认识TCP协议2. 认识UDP协议 四、 网络字节序五、 socket编程接口1. socket 常见API2. sockaddr结构&#xff08;1&#…

WebGIS的Web服务概述

WebGIS是互联网技术应用于GIS开发的产物&#xff0c;是现代GIS技术的重要组成部分&#xff0c;其中的Web服务是现代WebGIS的核心技术和重要标志&#xff0c;它集GIS、程序组件和互联网的优点于一身&#xff0c;深刻改变了GIS开发和应用的方式&#xff0c;绕过了本地数据转换和本…

Unity 批处理详讲(含URP)

咱们在项目中&#xff0c;优化性能最重要的一个环节就是合批处理&#xff0c;&#xff0c;在早期Unity中&#xff0c;对于合批的处理手段主要有三种&#xff1a; Static Batching Dynamic Batching GPU Instancing 如今Unity 为了提升合批范围与效率&#xff0c;提供了…

ICT测试原理

目录&#xff1a; 一、什么是ICT 二、ICT在哪使用 三、ICT如何测试 1、隔离(Guarding)原理 2、电容器测试原理 3、电感器测试原理 4、普通二极管测试方法(MODE D) 5、晶体管的测量原理 (三端点)(MODE TR) 6、短/开路的测试原理 1&#xff09;学习短路表 2&#xff…

基于chrome插件的企业应用

一、chrome插件技术介绍 1、chrome插件组件介绍 名称 职责 访问权限 DOM访问情况 popup 弹窗页面。即打开形式是通过点击在浏览器右上方的icon&#xff0c;一个弹窗的形式。 注: 展示维度 browser_action:所有页面 page_action:指定页面 可访问绝大部分api 不可以 bac…

【数据结构】排序算法——Lessen1

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【动态专修】2024年五菱维修手册和电路图资料更新

经过整理&#xff0c;2017-2024年五菱汽车全系列已经更新至汽修帮手资料库内&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表…

人、智能、机器人……

在遥远的未来之城&#xff0c;智能时代如同晨曦般照亮了每一个角落&#xff0c;万物互联&#xff0c;机器智能与人类智慧交织成一幅前所未有的图景。这座城市&#xff0c;既是科技的盛宴&#xff0c;也是人性与情感深刻反思的舞台。 寓言&#xff1a;《智光与心影》 在智能之…

Python自动化DevOps任务入门

目录 Python自动化DevOps任务入门 一、环境和工具配置 1. 系统环境与Python版本 2. 虚拟环境搭建 3. 必要的库安装 二、自动化部署 1. 使用Fabric进行流式部署 2. 使用Ansible编写部署剧本 三、持续集成和测试 1. 配置CI/CD工具 选择工具 配置工具 构建和测试自动…

【SLAM】最最最简单的直线拟合情形下的多种求解方法

本文我们讨论一个最最最简单情况下的拟合的情形&#xff0c;并尝试使用不同的方法来进行求解。 假如有一组数 x 1 , x 2 , x 3 , . . . , x n x_1,x_2,x_3,...,x_n x1​,x2​,x3​,...,xn​&#xff0c;对应的值为 y 1 , y 2 , y 3 , . . . , y n y_1,y_2,y_3,...,y_n y1​,y2…

10.11和10.8那个大(各种ai的回答)

问题&#xff1a;10.11和10.8两个数哪个大 腾讯混元 ✔️ chatGPT ❎ 通义千问 ❎ 文心一言 ✔️ 智谱清言 ❎ 讯飞星火 ✔️ C知道 ❎ 豆包 ✔️

TCP粘包问题详解和解决方案【C语言】

1.什么是TCP粘包 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输协议&#xff0c;它保证了数据的可靠性和顺序性。然而&#xff0c;由于TCP是基于字节流而不是消息的&#xff0c;因此在传输过…

【接口自动化_08课_Pytest+Yaml+Allure框架】

上节课一些内容 的补充 1、openxl这个方法&#xff0c;第一个元素是从1开始的&#xff0c;不是从0开始 回写的列在程序里写的是11&#xff0c;是因为是固定值 一、1. Yaml入门及应用 1、什么是yaml YAML&#xff08;/ˈjməl/&#xff0c;尾音类似camel骆驼&#xff09;是一…

Finding columns with a useful data type 找到合适的数据列的类型

Finding columns with a useful data type 在确定了原始查询的数据列数之后&#xff0c;接下来就是要确定合适的数据列的数据类型。可以用 SELECT a 的方式判断对应的数据列方式&#xff0c;有时候可以通过错误信息判断数据列的类型。如果服务器的响应没有报错&#xff0c;而…

Docker启动PostgreSql并设置时间与主机同步

在 Docker 中启动 PostgreSql 时&#xff0c;需要配置容器的时间与主机同步。可以通过在 Dockerfile 或者 Docker Compose 文件中设置容器的时区&#xff0c;或者使用宿主机的时间来同步容器的时间。这样可以确保容器中的 PostgreSql 与主机的时间保持一致&#xff0c;避免在使…

启动流程和切换流程

启动流程 #mermaid-svg-iUWGw8xl1SyAmoo9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-icon{fill:#552222;}#mermaid-svg-iUWGw8xl1SyAmoo9 .error-text{fill:#552222;stroke:#552222;}#…

C语言·分支和循环语句(超详细系列·全面总结)

前言&#xff1a;Hello大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;为了更好地形成一个学习c语言的体系&#xff0c;最近将会更新关于c语言语法基础的知识&#xff0c;今天更新一下分支循环语句的知识点&#xff0c;我们一起来看看吧~ 目录 一、什么是语句&#xf…