IP进程间的通信方式以及不同主机间的通信方式

embedded/2024/10/18 16:49:02/

一,IP进程间的通信方式

共享内存(最高效)

1.是一块内核的预留空间

2.避免了用户空间到内核空间的数据拷贝

1.产生key:ftok函数

功能:将pathname和pid_id转化为key

参数:(路径名,'A')

返回值:成功:key,失败:-1

2.通过key获取ipc对象:shmget函数

功能:申请一个共享内存对象

参数:(key, 1024, IPC_CREAT|0666)

3.共享内存绑定:shmat函数

功能:绑定地址空间

参数:(shmid, NULL, 0)

需要判断 

if (p == (void*) - 1)
{perror(shmid fail);return -1;
}

pause函数 进程阻塞 等一个信号

4.接除绑定:shmdt函数(断开映射现象) shmctl(销毁IPC对象)

功能:解除绑定

发送端:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
void handler(int signo)
{}int main(int argc, const char *argv[])
{//step1 产生key值key_t key = ftok(".",'A');if(key < 0){perror("ftok fail");return -1;}printf("key = %d\n",key);//step 2int shmid = shmget(key, 1024, IPC_CREAT | 0666);if(shmid < 0){perror("shmget fail");return -1;}printf("shmid = %d\n", shmid);//step 3   绑定地址空间void *p = shmat(shmid, NULL, 0);if (p == (void *)-1){perror("shmat fail\n");return -1;}signal(SIGUSR1, handler);pid_t *q = p;*q = getpid();char *s = p;while(1){printf("s = %s\n",s);if(strncmp(s,"quit",4) == 0)break;pause();}//step4 断开连接if(shmdt(p) < 0){perror("shmdt fail");return -1;}//step5 删除ipc对象if(shmctl(shmid, IPC_RMID, NULL) < 0){perror("shmctl fail");return -1;}return 0;
}

接收端:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>int main(int argc, const char *argv[])
{//step1 产生key值key_t key = ftok(".",'A');if(key < 0){perror("ftok fail");return -1;}printf("key = %d\n",key);//step 2int shmid = shmget(key, 1024, IPC_CREAT | 0666);if(shmid < 0){perror("shmget fail");return -1;}printf("shmid = %d\n", shmid);//step 3   绑定地址空间void *p = shmat(shmid, NULL, 0);if (p == (void *)-1){perror("shmat fail\n");return -1;}pid_t *q = p;printf("process a pid = %d\n",*q);pid_t pid = *q;while(1){char *s = p;fgets(s, 1024, stdin);kill(pid, SIGUSR1);if(strncmp(s,"quit",4) == 0)break;}//step4 断开连接if(shmdt(p) < 0){perror("shmdt fail");return -1;}//step5 删除ipc对象if(shmctl(shmid, IPC_RMID, NULL) < 0){perror("shmctl fail");return -1;}	return 0;
}

二,不同主机间进程通信方式

ip地址:标识网络中的一台主机

主机:能进行网络通信功能的机器

端口号:用开标识主机中某一具体(进行网络通信)进程

IP + 端口号:进程在网络中的地址

IP的组成:网络号+主机号

        网络号:表示所处网络

        主机号:表示能容纳的主机

网络编程

TCP/UDP

TPC协议特点:

1.面向连接 —— 类似于打电话,必须先打通

2.传输可靠 —— 保证数据准确可靠(tpc协议机制内功能)

3.面向字节流

UDP:

特点

1.不可靠

2.无连接

3.数据

类似于广播 wifi  对可靠性不高,需要效率高的内容

具体编程

代码

#include <sys/types.h>	       /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>int main(int argc, const char *argv[])
{int fd = socket (AF_INET, SOCK_DGRAM, 0);if (fd < 0){perror("socket fail");return -1;}printf("fd = %d\n", fd);char buf[1024];while(1){fgets(buf,1024,stdin);struct sockaddr_in seraddr;seraddr.sin_family = AF_INET;seraddr.sin_port = htons(50002);seraddr.sin_addr.s_addr = inet_addr("192.168.0.177");sendto(fd, buf, strlen(buf) + 1,0 ,(const struct sockaddr *)&seraddr, sizeof(seraddr));}return 0;
}

运行结果


http://www.ppmy.cn/embedded/100323.html

相关文章

大数据处理与智慧营销系统性能优化

随着企业数字化转型的加速&#xff0c;客户经营数字化正在向智能化方向发展&#xff0c;构建全场景、全流程、全触点的数字化、智能化的客户经营智慧营销体系。智慧营销系统已运行 5 年&#xff0c;伴随着业务增长&#xff0c;系统业务流程复杂度增大&#xff0c;大表数据量已超…

ETAS工具链自动化实战指南<一>

----自动化不仅是一种技术&#xff0c;更是一种思维方式&#xff0c;它将帮助我们在快节奏的工作环境中保持领先&#xff01; 目录 往期推荐 场景一&#xff1a;SWC 之间 port自动连接 命令示例 参数说明 场景二&#xff1a;SWC与ECU 自动映射 命令示例 参数说明 场景三&…

车辆分类检测数据集数据集

车辆分类检测数据集 数据集中的所有车辆分为六类:客车、微型客车、小型货车、轿车、SUV和卡车。每种车型的车辆数量分别为558辆、883辆、476辆、5922辆、1392辆、822辆。 xml标签 数据集描述&#xff1a; 该数据集包含多种类型的车辆图像&#xff0c;旨在用于训练和评估车辆分…

Elasticsearch 节点和索引管理

Elasticsearch 是一个分布式搜索和分析引擎&#xff0c;由多个节点组成&#xff0c;每个节点都扮演着特定的角色。有效的节点和索引管理是确保集群性能、稳定性和可扩展性的关键。本文将探讨如何在 Elasticsearch 中进行节点和索引管理&#xff0c;帮助管理员优化集群配置&…

合合信息文档解析Coze插件发布,PDF转Markdown功能便捷集成

近日&#xff0c;TextIn开发的PDF转Markdown插件正式上架Coze平台。 在扣子搜索“pdf转markdown”&#xff0c;或在Coze平台搜索“pdf2markdown”&#xff0c;即可找到插件&#xff0c;在你的专属智能体中便捷使用文档解析功能。 如果想测试解析插件在你需要的场景下表现如何&…

unity 使用Sqlite报错

Fallback handler could not load library C:/Users/Administrator/Desktop/xxx /_Data/MonoBleedingEdge/sqlite3&#xff0c; 出现DllNotFoundException: sqlite3 assembly:<unknown assembly> type:<unknown type> member:(null) 解决方法 &#xff1a;下载一个…

Flink常见数据源(source)使用教程(DataStream API)

前言 一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,如下图所示: 获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(exec…

鸿蒙Harmony编程开发:服务端证书锁定防范中间人攻击示例

1. TLS通讯中间人攻击及防范简介 TLS安全通讯的基础是基于对操作系统或者浏览器根证书的信任&#xff0c;如果CA证书签发机构被入侵&#xff0c;或者设备内置证书被篡改&#xff0c;都会导致TLS握手环节面临中间人攻击的风险。其实&#xff0c;这种风险被善意利用的情况还是很…