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

news2024/11/26 8:28:03

一,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 2
	int 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 2
	int 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.coloradmin.cn/o/2061104.html

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

相关文章

Java并发类API——ExecutorService

1.ExecutorService概述 ExecutorService 是 Java 并发库中一个非常重要的接口&#xff0c;它提供了一种管理和控制线程执行的方法。ExecutorService 是 Executor 接口的扩展&#xff0c;除了 Executor 提供的基础任务执行功能之外&#xff0c;ExecutorService 提供了更强大的功…

如何用Python构建高校爬虫与k-means算法实现专业评分可视化分析

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

工业互联网与大数据实训室解决方案

一、引言 1.1 工业互联网与大数据的重要性 工业互联网作为新一代信息技术与制造业深度融合的产物&#xff0c;正在全球范围内推动着制造业的数字化、网络化、智能化转型。它通过连接机器、物料、人和信息系统&#xff0c;实现数据的全面感知、动态传输和智能分析&#xff0c;…

白酒与素食:健康与美味的双重享受

在美食的世界里&#xff0c;白酒与素食的搭配仿佛是一场跨界的盛宴。豪迈白酒&#xff08;HOMANLISM&#xff09;的醇香与精致素食的清新&#xff0c;在不经意间交织出了一幅美妙的画卷&#xff0c;让人在品味中感受到健康与美味的双重享受。 素食&#xff0c;以其清淡、自然的…

Verilog刷题笔记54

题目&#xff1a; Fsm serialdp See also: Serial receiver and datapath We want to add parity checking to the serial receiver. Parity checking adds one extra bit after each data byte. We will use odd parity, where the number of 1s in the 9 bits received must…

如何在 FastReport .NET 中构建和安装 Postgres 插件

FastReport .NET 是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案。 功能非常丰富&#xff0c;功能广泛。今天我们将介绍如何使用报表设计器的 FastReport 插件连接数据库。 FastReport .NET 是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体…

LlamaIndex 介绍

LlamaIndex 是什么&#xff1f; 从字面上理解&#xff0c;是 Llama Index&#xff0c;Llama 是大语言模型&#xff0c;Index 是索引&#xff0c;Index for Llama 就是为大语言模型做索引&#xff0c;那么大语言模型为什么需要索引&#xff0c;索引的作用是什么&#xff1f; …

CAS-ViT实战:使用CAS-ViT实现图像分类任务(一)

摘要 在视觉转换器&#xff08;Vision Transformers, ViTs&#xff09;领域&#xff0c;随着技术的不断发展&#xff0c;研究者们不断探索如何在保持高效性能的同时&#xff0c;降低模型的计算复杂度&#xff0c;以满足资源受限场景&#xff08;如移动设备&#xff09;的需求。…

住宅代理助力网页抓取,DaaS实现数据驱动的业务优化

什么是DaaS&#xff1f;有什么作用&#xff1f; DaaS的工作原理是什么&#xff1f;哪些行业需要&#xff1f; 如何应用DaaS&#xff1f; 网页抓取如何助力优化DaaS&#xff1f; 总结 在数字化转型的浪潮中&#xff0c;数据已成为企业决策和业务优化的核心资源。数据即服务&…

特殊采购转包

在转包期间&#xff0c;公司从外部供应商处订购物料。与正常外部采购流程不同&#xff0c;公司将为供应商&#xff08;转包商&#xff09;提供部分或全部用于物料生产的部件。 该流程拥有以下特征&#xff1a; 通过转包订单订购成品&#xff0c;该转包订单还包含有关要为转包商…

培训第三十二天(学习playbook-roles,脚本创建数据库和表,mycat读写分离)

上午 1、roles&#xff08;角色&#xff09;介绍 roles(⻆⾊): 就是通过分别将variables, tasks及handlers等放置于单独 的⽬录中,并可以便捷地调⽤它们的⼀种机制。 假设我们要写⼀个playbook来安装管理lamp环境&#xff0c;那么这个 playbook就会写很⻓。所以我们希望把这…

入门STM32—外部中断

外部中断的存在使得微控制器能够及时响应外部事件&#xff0c;避免频繁的轮询操作&#xff0c;从而提高系统的实时性、效率和低功耗性能。 1.什么是外部中断&#xff1f; 外部中断是指微控制器接收到外部引脚的信号变化时触发的中断。STM32F103系列微控制器支持多个外部中断线…

破烂行情空仓,换两融深圳融资融券利率最低是多少?4-5%?

最近行情稀烂&#xff0c;持续缩量&#xff0c;已经空仓很久了&#xff0c;刚好趁这个机会换个融资融券账户&#xff01;现在深圳融资融券利率最低能做到什么水平&#xff1f; 融资融券是什么&#xff1f; 融资融券是股票交易市场上的一种投资方式&#xff0c;也被称为证券信…

python中len是什么

Python len() 方法返回字符串长度。 len()方法语法&#xff1a; len( str ) 返回值&#xff1a; 返回字符串长度。 以下实例展示了len()的使用方法&#xff1a; #!/usr/bin/python str "this is string example....wow!!!"; print "字符串长度: ", len…

Leetcode JAVA刷刷站(69)x的平方根

一、题目概述 二、思路方向 在Java中&#xff0c;计算一个非负整数x的算术平方根&#xff0c;并返回其整数部分&#xff0c;你可以使用二分查找法。这是因为平方根函数是单调递增的&#xff0c;所以我们可以利用二分查找在合理的时间复杂度内找到结果。 三、代码实现 public…

html+css+js网页设计 天猫首页

htmlcssjs网页设计 天猫首页 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&#xff0c;访问…

实现el-table 两列多选框且不可同时勾选,可单选,可多选

1.页面实现效果&#xff1a; 审核通过可批量处理&#xff0c;可单选&#xff1b;审核不通过&#xff0c;单选&#xff0c;但两者不可同时勾选☑️ 2.代码如下 <template lang"pug"> .financing-order-tab.table-container.btns(style"margin-bottom: 15p…

Tomcat使用及负载均衡(最全源码安装及配置使用教程)

目录 一 Tomcat概述 1.1 Tomcat 简介 1.2 Tomcat 下载 二 Tomcat 单主机配置 2.1 Tomcat 环境配置 2.2 Tomcat 安装与添加系统启动 2.3 Tomcat 启动与停止 三 Tomcat 配置文件及反向代理 3.1 配置文件详解 3.2 反向代理实现Tomcat部署 四 Memcached安装 4.1 简介 …

Ollama 企业私有化部署大模型最佳解决方案

为什么要私有化部署大模型&#xff1f; 很多企业为了控制成本和减少核心数据外泄的风险&#xff0c;会通过私有化部署大模型&#xff0c;来控制成本和保障企业的数据安全。 说到本地化部署&#xff0c;这时就需要说到Ollama框架了。 Ollama 是什么&#xff1f; Ollama 是一个开…

霸王茶姬小程序任务脚本

霸王茶姬小程序任务脚本 小白操作----仅供学习研究参考 功能&#xff1a; 积分签到 解析 该脚本用于“霸王茶姬小程序”的签到和积分查询操作。通过模拟网络请求登录账号&#xff0c;获取个人信息&#xff0c;执行每日签到&#xff0c;并查询积分情况。支持多账号操作&#…