AB实现双方通信

2023-05-16

题目要求:
通过C语言编写一个程序,程序中需要有两个进程,假设这两个进程是A和B,通过这两个进程模拟一个类似QQ聊天的情景,A进程和B进程分别代表通话一方,A进程能够发消息给B进程,同时还能接收B进程发送过来的消息,同样的,B进程能发送消息给A,同时接收A进程发送来的消息。

socket网络编程有几个步骤:

服务器:
1.socket()函数
2.bind()函数
3.listen()函数
4.accept()函数
5.read(),write(),close()等一系列文件相关的函数

客户端:
1.socket()函数
2.connect()函数
3.read(),write(),close()等一系列文件相关的函数

一、服务器代码:

Server.c:
#include<stdio.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
//头文件
int main(int argc,char **argv)
{
	int s_fd;
	int c_fd;
	//定义两个socket描述符,一个客户端一个服务器的
	
	char msg[128]={0};
	char readBuf[128]={0};
	//定义两个字符串数组一个用来接收另一个用来发送。
	
	struct sockaddr_in s_addr;
	struct sockaddr_in c_addr;
//定义两个sockaddr_in类型的结构体一个用于服务器一个客户端

	if(argc!=3)
	{
		printf("Number Error!\n");
		exit(-1);
	}//我们运行程序的时候要输入三个变量,一个运行文件,一个IP地址,还有一个端口号(他们的定义在实验三里边有提到)

	//socket
	// int socket(int domain, int type, int protocol);

	s_fd=socket(AF_INET,SOCK_STREAM,0);//第一个变量为协议  第二个为socket类型 第三个默认为0,表示自动匹配。
	if(s_fd!=-1)
	{
		printf("Socket Success!\n");
	}
	else
	{
		printf("Socket Error!\n");
		exit(-1);
	}
	//上面创建了一个socket描述字,但没有一个具体的地址,用并bind()函数绑定地址
	//bind
//    int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

	s_addr.sin_family=AF_INET;//协议   AF_INET决定了要用ipv4的地址和16位的端口号组合
	s_addr.sin_port=htons(atoi(argv[2]));//端口号转化为网络字节序
	inet_aton(argv[1],&s_addr.sin_addr);//IP地址
	
	bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));//绑定s_fd和s_addr

	//listen监听函数
	//       int listen(int sockfd, int backlog);
	listen(s_fd,10);//第一个参数为客户端描述字,第二个是最大连接个数


	//accept
	//   int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
	int len=sizeof(struct sockaddr_in);
	while(1)
	{
		c_fd=accept(s_fd,(struct sockaddr *)&c_addr,&len);//没有连接就会一直阻塞到accept。

		if(c_fd!=-1)
		{	
			printf("Accept Success!\n");
		}
		else
		{
			printf("Accept Error!\n");
		}

		if(fork()==0)//当有连接后创建一个子进程来读客户端发送过来的数据
		{
			while(1)
			
			{
				memset(readBuf,0,sizeof(readBuf));//每消息读取一次后将readBuf清零
				read(c_fd,readBuf,sizeof(readBuf));//read函数第一个变量是客户端socket描述符(从哪儿读),第二个变量是读到哪里去,第三个变量是读多少。
				printf("FROM client:%s\n",readBuf);//打印
			}
		}
		else//父进程发送数据到客户端
		{
			while(1)
			{
				memset(msg,0,sizeof(msg));//清零
				printf("Inptu: ");
				gets(msg);//将输入的内容保存到msg里面
				write(c_fd,msg,strlen(msg));//write函数第一个变量也是客户端socket描述符(写到哪儿去),第二个变量是需要写的内容,第三个变量是要写的内容的大小。
			}
		}

	}

	return 0;
}

客户端代码:

client.c
#include<stdio.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<string.h>
int main(int argc ,char **argv)
{
	int c_fd;
	int n_read;
	int n;
	char buf[128]={0};
	char readBuf[128]={0};
	struct sockaddr_in c_addr;


	if(argc !=3)
	{
		printf("Number Error!\n");
		exit(-1);
	}

	c_fd=socket(AF_INET,SOCK_STREAM,0);
	if(c_fd!=-1)
	{
		printf("Socket Success!\n");
	}
	else
	{
		printf("Socket Failed!\n");
		exit(-1);
	}
	c_addr.sin_family=AF_INET;
	c_addr.sin_port=htons(atoi(argv[2]));
	inet_aton(argv[1],&c_addr.sin_addr);//这些和服务器代码是一样的,意思也相同。

	//connect
	//       int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
	while(1)
	{
		n=connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in));
		//connect函数第一个参数对应客户端的socket描述字,第二个参数为服务器的socket地址,第三个参数表示socket地址的大小
		if(n==-1)
		{
			printf("Connect Faileed!\n");
			exit(-1);
		}
		else
		{
			printf("Connect Success!\n");
		}
		if(fork()==0)
		{
			while(1)
			
			{
				memset(buf,0,sizeof(buf));
				printf("Input: ");
				gets(buf);
				write(c_fd,buf,strlen(buf));
			}
		}
		else
		{
			while(1)
			{
				memset(readBuf,0,sizeof(readBuf));
				read(c_fd,readBuf,sizeof(readBuf));
				printf("From Serever :%s\n",readBuf);
			}
		}
	}
	return 0;
}

我们的工程文件夹里面应该是有两个c文件的,一个服务器一个客户端。
在这里插入图片描述
编译

gcc server.c -o server
gcc client.c -o client

编译之后就会增加两个可执行文件。
在这里插入图片描述
然后ifconfig获得虚拟IP地址
在这里插入图片描述
如果输入ifconfig后为下面这样:
在这里插入图片描述
提示没有网络相关工具sudo apt install net-tools下载就可以了

我们来看看结果:

输入./server 172.20.10.5 6666然后回车运行,再Ctrl+a/t+t重新打开一个终端在刚才的目录下面运行client

如图中所示:
在这里插入图片描述

  • 客户端发送数据给服务器

在这里插入图片描述

  • 服务器发送数据给客户端

在这里插入图片描述
大致完成!

AB进程间通信

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

AB实现双方通信 的相关文章

  • CubeMX配合PlatformIO开发STM32(STorM32),配置双MPU6050(板载与外置),并使用gui显示数据

    本人使用的设备 驱动 xff1a Windows10串口助手 4 3 25 其实啥都行 桃饱随处可买的usb ttl xff08 ch340G xff09 桃饱随处可买的stlinkmpu6050 xff08 一个板载 xff0c 一个通过
  • ros学习心得(九)ros之Topic通讯机制及发送与接收节点的编码与调试

    节点间需要有数据交互 xff0c 而ros所要解决的问题就是数据该如何交互 一 通讯原理图 ros在设计Node间通讯机制的时候 xff0c 考虑的是很周全的 Publisher 发送消息的 xff0c Subscriber 接收消息的 T
  • 硬石开发板STM32F407IGT6 (HAL库)学习笔记

    硬石开发板STM32F407IGT6 xff08 HAL库 xff09 学习笔记 2020 06 21 2020 06 22 2020 06 23 2020 06 24 该笔记为学习时遇到的问题与解决方法等内容的记录 xff0c 可能有错
  • Ubuntu20/视觉SLAM十四讲踩坑记录

    Ubuntu 视觉SLAM十四讲踩坑记录 Ubuntu xff08 20 xff09 视觉SLAM十四讲踩坑记录 xff1a 共性问题 xff1a 1 安装OpenCV后 xff0c 例程仍无法找到OpenCV文件 ch3 visualiz
  • AMESim2020.1仿真编译失败解决方法之一

    AMESim2020 1仿真编译失败解决方法之一 问题描述 xff1a 软件安装正确 xff0c 在准备和matlab联合仿真时 xff0c 换用VC2015以上版本编译器编译失败 解决方法 xff1a 到AMESim安装路径下 xff0c
  • Linux/Ubuntu20.04下载安装Geant4及B1示例测试

    Linux Ubuntu20 04下载安装Geant4及B1示例测试 0 参考内容1 下载geant4软件包2 geant4安装准备内容3 geant4文件编译4 安装数据包4 1 安装方式14 2安装方式2 5 添加文件路径6 B1示例测
  • Ubuntu20.04进行CUDA11.0及对应CUDNN安装

    Ubuntu20 04进行CUDA11 0及对应CUDNN安装 xff1a 基本步骤 xff1a 1 安装nvidia显卡驱动 可直接通过 xff1a 软件和更新 gt 附加驱动 选择满足CUDA版本的nvidia专有驱动 gt 应用更改
  • git分离头指针处理

    文章目录 1 什么是git分离头指针2 将git 分离头指针所指向的代码 xff08 commit id xff09 保存下来总结 本文将主要介绍一下git分离头指针状态 xff0c 并记录如何将分离头指针状态的代码合并到分支中 1 什么是
  • Docker使用系列——Docker安装(Ubuntu20.04)

    Docker使用系列 Docker安装 xff08 Ubuntu20 04 xff09 卸载安装测试问题 直接按官方安装教程即可 xff1a Install Docker Engine on Ubuntu 卸载 安装过老版本的Docker则
  • Docker使用系列——生成一个Ubuntu20.04+Pyqt5的容器

    由于在自己的电脑中安装Pyqt5不成功 xff0c 原因是与其他环境中的qt版本不兼容 因此 xff0c 了解到了docker xff0c 这里记录一下在docker中安装pyqt5过程 1 安装Docker并从官方仓库拉取Ubuntu 2
  • C语言实现链表(链式存储结构)

    链表 xff08 链式存储结构 xff09 及创建 链表 xff0c 别名链式存储结构或单链表 xff0c 用于存储逻辑关系为 一对一 的数据 与顺序表不同 xff0c 链表不限制数据的物理存储状态 xff0c 换句话说 xff0c 使用链
  • cmake与make的区别及CMakeLists.txt文件编写

    一 cmake与make的区别 make工具是一个自动化编译工具 xff0c 它会根据Makefile中的规则进行批处理编译 当需要编译的文件较多时 xff0c 使用make工具会大大提高效率 但是 xff0c 当项目较大时 xff0c 编
  • 接口测试学习必看 - 实现简易接口测试

    前言 终于整理到了接口测试部分的内容 xff0c 接口测试可以说是软件测试入门到初级软件测试的一个必备进阶技巧 很多挂着 灰盒测试 的标识 xff0c 其实就是对接口测试的另外一层理解 何为 灰盒 xff0c 能够看到一部分本质的东西 xf
  • roscpp 底层通讯协议更改

    ROS为机器人开发者们提供了不同语言的编程接口 xff0c 其中C 43 43 接口叫做roscpp xff0c 用来创建topic service param xff0c 实现ROS的通信功能 roscpp is a C 43 43 im
  • c++学习心得:STL初学(基础篇)

    标准函数库 xff08 STL xff09 学习心得 基础篇 STL主要由两种组件构成 xff1a 一是容器 xff0c 包括vector list set map等类 xff1b 另一种组件是用以操作这些容器的所谓的泛型算法包括find
  • STM32 LoRa无线数传模块 PC通过串口传输数据到单片机

    STM32 PC通过串口助手无线传输数据到单片机 之前学习了STM32单片机 xff0c 使用正点原子的精英板 两个TTL 转LoRa 半双工无线数传模块 xff0c 通过PC机串口助手 xff0c 向32单片机传输数据 xff0c 接收数
  • 如何使用 datax 将 mysql 中的数据拉取到 hive ?

    需求 使用datax将mysql中的数据拉取到hive的ods层 步骤 首先在mysql中确定好需要拉取的表user extend xff0c 然后对应在hive中创建好空表 xff0c 等待拉取 这里对应创建的hive表格如下 CREAT
  • C语言实现TCP客户端、服务器

    服务器 include lt stdio h gt include lt sys socket h gt include lt netinet in h gt include lt arpa inet h gt include 34 str
  • 树莓派控制无人机实现定点降落(概述目录)

    最近在做一个无人机与车协同的项目 xff0c 无人机需要比较准确地落到车的平台上 xff0c 而且因为经费较少只能用树莓派 xff0c 我的思路以及在调试过程中遇到的问题 xff0c 将公布在我接下来的博文里 这里列个目录 xff1a 树莓
  • C语言字符串常用函数总结(持续更新)

    最近在重温C语言的一些基础知识 xff0c 感觉C语言字符串操作还是比较难的 xff0c 在学习的过程中总结了一些常用的字符串相关函数 xff0c 包括C语言字符串输入 字符串输入 计算字符串长度 字符串赋值 字符串分割 字符串拼接 字符串

随机推荐

  • git tag和branch的关系

    tag类似于从commit发展出来的一个可写的玩具分支 它和branch很像 xff0c 但是可以快速取消所有修改 更多是用于快照查看的 如果它基于的commit被ammend变化了 xff0c 他俩的commit id 就会不一样了 xf
  • git命令之分支管理和Tag标签

    x1f4dd 个人简介 个人主页 xff1a 我是段段 x1f64b x1f34a 博客领域 xff1a 编程基础 前端 x1f4bb x1f345 写作风格 xff1a 干货 xff01 干货 xff01 都是干货 xff01 x1f35
  • 4个方面轻松搞定进度条

    不管是在APP还是PC xff0c 不管是Loading页 xff0c 还是在音乐播放器中 xff0c 进度条的运用都非常广泛 xff0c 形式也多种多样 xff0c 让人眼花缭乱 做为一个交互设计新手 xff0c 项目中也经常碰到进度条设
  • Ubuntu18.04安装ROS初始化rosdep阶段报错的解决方案

    在运行rosdep update时出现 reading in sources list data from etc ros rosdep sources list d ERROR unable to process source https
  • 菜鸡的ROS学习笔记(image_transport)

    菜鸡的ROS学习笔记 xff08 image transport xff09 image transport 这一部分是搬运的ROS wiki中的介绍 xff0c 主要是image transport这个包的用法 xff0c 之后我会把它尽
  • MS5611气压计数据采集(模拟IIC)/温度采集/相对高度求解

    MS5611气压计数据采集 模拟IIC 温度采集 相对高度求解 1 MS5611气压计属性 1 1 基础属性 MS5611使用24位ADC 可以采集温度和气压 xff0c 并且温度可以用来补偿气压 xff0c MS5611在出厂时进行了校准
  • 嵌入式物联网【数据处理篇】C 语言char类型与int类型的转化

    char和int的转换有两种方式 这两种方式适合于在输出时使用 最简单的方法就是利用ASSCII码的差值 直接用char的值减去 0 就行了 eg char nbsp a nbsp 9 int nbsp a a 0 另一个就是要利用c语言的
  • QT数据库:在QT中多线程访问mysql数据库的问题(已解决)

    一 可以便捷的使用多线程并发类QtConcurrent解决 关于类的使用请参考博客 便捷的使用多线程并发类QtConcurrent解决Qt在槽函数中执行耗时操作导致界面卡住的问题 吻等离子的博客 CSDN博客 二 出现问题 QT使用全局db
  • RS485、RS232、TTL的电平以及数据的收发

    目录 一 RS232 1 RS232标准接口定义 2 RS232串口线颜色定义 3 RS232串口接线方法 4 RS232的电平 二 RS485 xff08 基于MAX85的收发介绍 xff09 1 RS485标准接口定义 2 RS485串
  • 软件使用:如何彻底把VMware卸载干净

    1 禁用VM虚拟机服务 首先 xff0c 需要停止虚拟机VMware相关服务 按下快捷键WIN 43 R xff0c 打开windows运行对话框 xff0c 输入services msc 点击确定 在服务管理中 xff0c 找到VM开头的
  • Qt编译器MinGW和MSVC的区别

    一 两者的区别 1 MSVC 即Microsoft Visual C Compiler 即微软自己的编译器 我们下载Windows下的OpenCV时 解压后里面有两个文件夹 一个是build 一个是source build这个文件夹实际上是
  • Visual Studio快捷键(超全)

    目录 常用 xff1a 一 文件相关 二 编辑搜索相关 三 导航视图相关 四 项目相关 五 生成相关 六 调试相关 七 调试相关 八 分析相关 九 工具相关 十 扩展相关 十一 窗口相关 十二 帮助相关 常用 xff1a ctrl 43 x
  • 【软件使用】MarkText下载安装与汉化设置 (markdown快捷键收藏)

    一 安装与汉化 对版本没要求的可以直接选择 3 免安装的汉化包 1 下载安装MarkText MaxText win64 https github com marktext marktext releases download v0 17
  • 嵌入式【协议篇】CAN协议原理

    nbsp 一 CAN协议介绍 1 简介 CAN是控制器局域网络 Controller Area Network CAN 的简称 是一种能够实现分布式实时控制的串行通信网络 其实可以简单把CAN通信理解成开一场电话会议 当一个人讲话时其他人就
  • 曲阜师范大学831学姐高分背诵笔记(完整版)

    导论部分 1 微格教学 18 名词解释 答 微格教学称为 微型教学 xff0c 也称为 小型教学 所谓 微格教学 xff0c 就是将复杂的教学过程分解成许多容易掌握的具体的单一的技能 xff0c 如 导读技能 34 讲授技能 提问技能 等
  • STM32 【FreeRTOS HAL库】创建任务

    任务也不是很复杂的东西 简单得说 创建一个任务 你得提供它的执行函数 你得提供它的栈的大小 函数的执行空间 函数的优先级等重要的条件 因为任务在运行中 任务函数有调用关系 有局部变量 这些都保存在任务的栈里面 任务有可能被切换 有可能被暂停
  • 函数实现是否应该放在头文件

  • Microsoft Visual Studio C++2022 Windows 11 SDK环境

    Microsoft Visual Studio C 43 43 2022 Windows 11 SDK环境 1 安装2 环境变量本文为作者 难拳 原创 xff0c 转载请注明出处 1 安装 Visual Studio 2022适用于Wind
  • 【原创】浅谈指针(十)链表的写法

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 前言 最近我又
  • AB实现双方通信

    题目要求 xff1a 通过C语言编写一个程序 xff0c 程序中需要有两个进程 xff0c 假设这两个进程是A和B xff0c 通过这两个进程模拟一个类似QQ聊天的情景 xff0c A进程和B进程分别代表通话一方 xff0c A进程能够发消