socket实现全双工通信,多个客户端接入服务器端

news2024/9/21 20:40:40

socket实现全双工通信

客户端:

 

#define IP "192.168.127.80"            //服务器IP地址
#define PORT 7266                      // 服务器端口号

int main(int argc, const char *argv[])
{
	//1.创建套接字:用于接收客户端链接请求
	int sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success sockfd=%d\n",sockfd);  //3

	//2.绑定IP地址和端口号
	
	//3.连接服务器
	//3.1填充要连接的服务器地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;                 //协议族
	sin.sin_port=htons(PORT);           //服务器端口号
	sin.sin_addr.s_addr=inet_addr(IP);  //服务器IP
	//3.2连接服务器
	if(connect(sockfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("connect error\n");
		return -1;
	}
	printf("connect success\n");

	//4.数据通信
	char wbuf[128]="";                 //用于接收信息

	int res=fork();
	if(res>0)
	{
		while(1)
		{
			//从终端获取数据
			bzero(wbuf,sizeof(wbuf));
			printf("\033[1;34;10m[客户端]请输入:\033[0m");
			fgets(wbuf,sizeof(wbuf),stdin);
			wbuf[strlen(wbuf)-1]='\0';
			if(strcmp(wbuf,"quit")==0)
			{
				break;
			}

			//将数据发送给服务器
			send(sockfd,wbuf,strlen(wbuf),0);
		}
	}
	else if(res==0)
	{
		while(1)
		{
			//接收服务器发来的信息
			bzero(wbuf,sizeof(wbuf));
			recv(sockfd,wbuf,sizeof(wbuf),0);
			printf("\033[1;32;10m\033[16D收到服务器的信息为:\033[0m%s\n",wbuf);
		}
	}
	else{
		perror("fork");
		return -1;
	}
	//5.关闭套接字
	close(sockfd);

	return 0;
}

 服务器端:

#define IP "192.168.127.80"            //服务器IP地址
#define PORT 7266                       // 服务器端口号

int main(int argc, const char *argv[])
{
	//1.创建套接字:用于接收客户端链接请求
	int sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd==-1)
	{
		perror("socket error");
		return -1;
	}
	printf("socket success sockfd=%d\n",sockfd);  //3

	//2.绑定IP地址和端口号
	//2.1填充地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family=AF_INET;             //地址族
	sin.sin_port=htons(PORT);           //端口号
	sin.sin_addr.s_addr=inet_addr(IP);  //IP地址
	//2.2绑定工作
	if(bind(sockfd,(struct sockaddr*)&sin,sizeof(sin))==-1)
	{
		perror("bind error");
		return -1;
	}
	printf("bind success!\n");

	//3.将套接字设置为被动监听状态
	if(listen(sockfd,128)==-1)
	{
		perror("listen error\n");
		return -1;
	}
	printf("listen success!\n");

	//4.阻塞等待客户端链接请求
	//定义地址信息结构体用于接收客户端地址信息
	struct sockaddr_in cin;              
	socklen_t socklen=sizeof(cin);     //接收地址信息的长度
	//返回一个数据交互的文件描述符
	int acceptfd=accept(sockfd,(struct sockaddr*)&cin,&socklen);
	if(acceptfd==-1)
	{
		perror("accept error\n");
		return -1;
	}
	printf("[\033[1;32;10m%s:%d]:已链接\033[0m \033[1;33;10macceptfd=%d\n\033[0m",\
			inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),acceptfd);//IP Port client

	//数据通信
	char rbuf[128]="";                 //用于接收信息
	int res=fork();
	if(res>0)
	{
		while(1)
		{
			//向客户端发送信息
			bzero(rbuf,sizeof(rbuf));      //清空容器
			printf("\033[1;33;10m[服务器端]请输入:\033[0m");
			fgets(rbuf,sizeof(rbuf),stdin);
			send(acceptfd,rbuf,strlen(rbuf),0);	
		}
	}
	else if(res==0)
	{
		while(1)
		{
			//从套接字文件中读取信息
			bzero(rbuf,sizeof(rbuf));      //清空容器
			int ret=recv(acceptfd,rbuf,sizeof(rbuf),0);
			if(ret==0)
			{
				printf("\033[1;33;10m客户端已下线\n\033[0m");
				break;
			}
			else if(ret<0)
			{
				perror("recv");
				return -1;
			}
			else
				printf("\033[1;32;10m\033[17D[%s:%d]:\033[0m%s\n",\
						inet_ntoa(sin.sin_addr),ntohs(cin.sin_port),rbuf);
		}
	}
	else{
		perror("fork");
		return -1;
	}

	//6.关闭套接字
	close(sockfd);
	close(acceptfd);

	return 0;
}

 

结果: 

 

多个客户端接入服务器端 

 

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

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

相关文章

MSQP Mysql数据库权限提升工具,UDF自动检测+快速反向SHELL

项目地址:https://github.com/MartinxMax/MSQP MSQP 这是一个关于Mysql的权限提升工具 安装依赖 $ python3 -m pip install mysql-connector-python 使用方法 $ python3 msqp.py -h 权限提升:建立反向Shell 在建立反向连接前,该工具会自动检测是否具有提权条件&#xff0…

4-4 数值稳定性 + 模型初始化和激活函数

数值稳定性 这里的 t t t表示层&#xff0c;假设 h t − 1 h^{t-1} ht−1是第 t − 1 t-1 t−1层隐藏层的输出&#xff0c;经过一个 f t f_{t} ft​得到第 t t t层隐藏层的输出 h t h^{t} ht。 y y y表示 x x x进来&#xff0c;第一层一直到第 d d d层&#xff0c;最后到一个损…

2024最新网络安全自学路线,内容涵盖3-5年技能提升

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

NC 二叉树的最大深度

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 求给定二叉树…

图像数据增强方法概述

图像数据增强方法概述 1. 什么是图像数据增强技术?2. 图像数据增强技术分类2.1 几何变换Python 示例代码 2.2 颜色变换2.3 噪声添加 3. 参考文献 1. 什么是图像数据增强技术? 基础概念&#xff1a;图像增强技术是计算机视觉和图像处理领域中的一个关键技术&#xff0c;主要用…

数据库安全综合治理方案(可编辑54页PPT)

引言&#xff1a;数据库安全综合治理方案是一个系统性的工作&#xff0c;需要从多个方面入手&#xff0c;综合运用各种技术和管理手段&#xff0c;确保数据库系统的安全稳定运行。 方案介绍&#xff1a; 数据库安全综合治理方案是一个综合性的策略&#xff0c;旨在确保数据库系…

C++文件系统操作6 - 跨平台实现查找指定文件夹下的特定文件

1. 关键词 C 文件系统操作 查找指定文件夹下的特定文件 跨平台 2. fileutil.h #pragma once#include <string> #include <cstdio> #include <cstdint> #include "filetype.h" #include "filepath.h"namespace cutl {/*** brief The fi…

前端练习<HtmlCSS>——照片墙(附完整代码及实现效果)

这个小练习也来源于b站up小K师兄&#xff0c;大家可以通过下面的链接学习哦~up讲的非常详细。 纯CSS写一个简单酷炫的照片墙效果&#xff5e; 先看一下这个照片墙的效果&#xff1a; 1.鼠标没有放到图片上时&#xff0c;照片同比例&#xff0c;每张照片都有倒影的效果。 2.然…

linux怎么创建python

第一步&#xff0c;创建一个test文件夹。 第二步&#xff0c;打开终端进入该文件。 第三步&#xff0c;vim test.py。 第四步&#xff0c;编写代码。 第五步&#xff0c;编辑好之后&#xff0c;按Esc键切换到命令模式&#xff0c;然后输入:wq&#xff0c;再按回车键即可自动保存…

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率&#xff0c;并且最近微软官方也是开源了一下graphrag的源码&#xff0c;所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术&#xff0c;也就是我们提出问题的时候&…

MATLAB基础:数组及其数学运算

今天我们继续学习MATLAB中的数组 我们在学习MATLAB时了解到&#xff0c;MATLAB作者秉持着“万物皆可矩阵”的思想企图将数学甚至世间万物使用矩阵表示出来&#xff0c;而矩阵的处理&#xff0c;自然成了这门语言的重中之重。 数组基础 在MATLAB中&#xff0c;数组是一个基本…

LCD 横屏切换为竖屏-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

LCD 横屏切换为竖屏 横屏显示如何切换为竖屏显示 LCD 屏默认横屏显示 开发板配套的 LCD 屏默认都是横屏显示&#xff0c;如 4.3 寸、7 寸和 10.1 寸的不同分辨率的 RGB LCD 屏 固定坐标体系 &#xff08;以 800*480 分辨率为例&#xff09;横屏模式下的固定坐标&#xff1a;…

【JavaScript】深入理解 `let`、`var` 和 `const`

文章目录 一、var 的声明与特点二、let 的声明与特点三、const 的声明与特点四、let、var 和 const 的对比五、实战示例六、最佳实践 在 JavaScript 中&#xff0c;变量声明是编程的基础&#xff0c;而 let、var 和 const 是三种常用的变量声明方式。本文将详细介绍这三种变量声…

Blackbox AI-跨时代AI产物,你的私人编程助手

1. 引言 随着人工智能技术的飞速发展&#xff0c;我们的生活方式正在经历前所未有的变革。从智能家居到自动驾驶&#xff0c;AI已经渗透到我们生活的方方面面。而在这场科技革命中&#xff0c;Blackbox 网站凭借其先进的技术和全面的功能&#xff0c;成为了众多AI产品中的佼佼者…

基于单片机控制的锂电池组电路的设计

摘 要: 提 出 一 种 基 于 单 片 机 控 制 的 锂 电 池 组 电 路 设计 方 案 . 采 用 8 位 CMOS 闪 存 单 片 机 PIC16F886 作 为主控芯 片 , 电 路 设计 中 含 有 S-8254 芯 片 的 一 次 保 护 电 路 、 S-8244 芯 片 的 二 次 保 护 电 路 和 MCU 的 辅 助 保 护 功…

photoshop学习笔记——选区3 快速选择工具

快速选择工具 W shift W 在3种快速选择工具之间切换 对象选择工具 photoshop CC中没有这个工具&#xff0c;利用AI&#xff0c;将款选中的对象快速的提取选区&#xff0c;测试了一下&#xff0c;选区制作的非常nice快速选择工具 跟磁性套索类似&#xff0c;自动识别颜色相似…

qt初入门9:qt记录日志的方式,日志库了解练习(qInstallMessageHandler,qslog, log4qt)

项目中用到qt&#xff0c;考虑有需要用到去记录日志&#xff0c;结合网络&#xff0c;整理一下&#xff0c;做记录。 简单了解后&#xff0c;qt实现日志模块思考&#xff1a; 1&#xff1a;借助qt自带的qInstallMessageHandler重定向到需要的目的地。 2&#xff1a;自己封装一…

JAVA SE 类和对象

类和对象 类定义和使用类的定义格式 类的实例化什么是实例化 this 引用this引用的特性 对象的构造及初始化如何初始化对象构造方法概念特性 在这里插入图片描述 **注意**&#xff1a; 封装封装的概念封装扩展之包导入包中的类自定义包包的访问权限控制举例 static成员static修饰…

MOZHE SQL手工注入漏洞测试(MySQL数据库)

主界面URL没有参数&#xff0c;无法判断是否有注入点 点击公告 【浏览器不便于查看返回包可以用burp】 测试URL 参数后加上单引号&#xff0c;报错&#xff0c;说明存在注入点 http://124.70.64.48:40021/new_list.php?id1 获取表列数 order by 4 返回200 order by 5 …

鸿蒙应用框架开发【N-Body模拟程序】

N-Body模拟程序 介绍 在本示例中&#xff0c;使用ArkTS编程语言开发了业界编程语言基准测试项目[Benchmarks Game]中的[N体问题模拟程序]&#xff0c;实现类木星体轨道计算。 本示例用到了ohos.taskpool和ohos.worker 接口。示例中的程序可以用于AOT(Ahead Of Time)等性能测…