用C/C++写一个客户端和服务器之间进行TCP通信的DEMO

目录

一、Visual Sudio 2022

二、配置

三、说明

四、客户端

五、服务端

六、演示


一、Visual Sudio 2022

Visual Studio 2022是微软公司推出的一款集成开发环境(IDE),旨在为开发人员提供全面的工具集,支持从Windows到MacOS、iOS和Android等多个平台的开发。

  1. 跨平台支持:Visual Studio 2022支持.NET MAUI(Multi-platform App UI),这是一个跨平台的UI框架,允许开发者使用C#和XAML为Windows、Android、MacOS以及iOS等平台创建统一的客户端应用。此外,ASP.NET Blazor Web技术也支持通过.NET MAUI编写桌面应用程序。

  2. C++支持:Visual Studio 2022为C++工作负载提供了强大的支持,包括新的生产功能、C++ 20工具和IntelliSense,显著简化了大型代码库的管理流程,并改进了诊断功能,使得调试更易于进行。

  3. 实时协作:通过Live Share功能,开发人员可以实时共享编码会话,加快团队的编辑和调试周期。Live Share还引入了集成文本聊天功能,方便团队成员之间的沟通。

  4. AI支持:Visual Studio 2022集成了AI IntelliCode引擎,能够无缝预测开发人员的下一步操作,提高开发效率。此外,AI还支持代码完成功能,帮助开发人员更快地编写代码。

  5. 部署和测试:Visual Studio 2022简化了Azure部署流程,提供了针对常见应用程序类型的模板和本地仿真器所需的依赖项预配功能。它还支持在Windows、Linux和MacOS上进行测试,确保应用在所有平台上都能正常运行。

  6. 性能优化:Visual Studio 2022是一个64位应用程序,能够处理任何大小和复杂性的项目,而不会出现内存不足的情况。它还专注于改善搜索、Git工具和其他重要功能的性能,提高开发人员的效率。

  7. 安全性:Visual Studio 2022通过提供访问控制和自定义编辑器设置等个性化会话,确保代码的一致性和安全性。

二、配置

打开visual studio 2022的属性页面

将SDL检查设置为否 。

三、说明

将客户端与服务端分别实现,打开服务端后,进入等待连接状态,打开客户端连接成功后,提示输入信息,当输入"playmusic"后,服务器端响应播放mp3文件(自己找一个mp3文件,放到debug路径下,与exe文件在同一目录下),关闭客户端后服务器端停止工作。

四、客户端

#include<iostream>
#include<WinSock2.h>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main()
{
	// 开启网络权限
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	// 创建socket
	SOCKET client_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (client_socket == -1) 
	{
		cout << "client socket create failed !!! Error Code: " << GetLastError() << endl;
		exit(-1);
	}

	// 创建目标IP和端口
	struct sockaddr_in target;
	target.sin_family = AF_INET;
	target.sin_port = htons(8080);
	target.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

	// 直接连接
	if (connect(client_socket, (struct sockaddr*)&target, sizeof(struct sockaddr)) == -1)
	{
		cout << "connect server failed !!!  Error Code:" << GetLastError() << endl;
	}
	// 发消息
	while (true) 
	{
		char buff[BUFSIZ * 4] = { 0 };
		cout << "please input send content:" << endl;
		cin >> buff;
		int ret = send(client_socket, buff, strlen(buff), 0);
		if (ret <= 0)
			break; 
	}
	return 0;
}

五、服务端

#include<iostream>
#include<stdio.h>
// winsock  widows自带的
#include<WinSock2.h>// Windows 网络通讯头文件
// 一个库文件 (windows 不开源)
#pragma comment(lib,"ws2_32.lib")

// 媒体库
#include<mmsystem.h>
#pragma comment (lib,"winmm.lib")

using namespace std;
int main()
{
	// 开启网络
	WSADATA wsaData;
	WSAStartup(MAKEWORD(2, 2), &wsaData);

	// TCP协议,流式协议,三次握手和四次挥手
	
	// socket套接字 IPV4/IPV6 IP TCP UDP RAW
	// socket( 
	// int af,    // 协议地址族  IPV4/IPV6  AF_INET/AF_INET6
	// int type,   // 协议类型  TCP UDP RAW  / SOCK_STREAM SOCK_DGRAM  SOCK_RAW 
	// int protocol // 保护方式
	// );
	SOCKET server_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (server_socket == -1) 
	{
		cout << "server socket create failed !!!  Error Code:" << GetLastError << endl;
		exit(-1);
	}

	/*
	typedef struct sockaddr_in {
	unsigned short sin_family;  // 协议地址族
	unsigned short sin_port;    //  端口号  5000+  8080 9090 
								// htons() // 小端序转换成大端序
    IN_ADDR sin_addr;			// 网卡 --> 硬件网卡  WIFI  蓝牙  虚拟网卡  0.0.0.0  表示全部都检测 
								// 127.0.0.1 192.168.0.100
								// inet_addr()  // 将点分十进制的IP地址转换成整数
    CHAR sin_zero[8];			// 保留位置,可能之后会用到的
} SOCKADDR_IN, *PSOCKADDR_IN;
	*/
	struct sockaddr_in local;
	local.sin_family = AF_INET;
	local.sin_port = htons(8080); // htons 返回的是是unsigned short
	local.sin_addr.S_un.S_addr = inet_addr("0.0.0.0");


	// 绑定socket和端口
	if (bind(server_socket, (struct sockaddr*)&local, sizeof(struct sockaddr_in)) == -1)
	{
		cout<<"bind server socket failed !!!  Error Code:"<<GetLastError()<<endl;
		exit(-1);
	}

	// 监听端口
	if (listen(server_socket, 10) == -1)
	{
		cout << "listen server socket failed !!!  Error Code:" << GetLastError() << endl;
		exit(-1);
	}

	cout << "bind and listen success. wait client connect ..." << endl; 

	// 等待客户端的连接 accept在进行的过程中 就是三次握手
	// accept是一个阻塞函数
	SOCKET client_socket = accept(server_socket, NULL, NULL);

	while (true)
	{
		char buff[BUFSIZ * 4] = { 0 };
		// 接收数据
		int ret = recv(client_socket, buff, BUFSIZ * 4, 0);
		// recv 返回值为-1 表示出错了
		// recv 返回值为0 表示正常断开
		// recv 返回值为正数 表示接收到了多少数据
		if (ret <= 0) {
			break;
		}
		cout << "接收到多少数据:" << ret << endl;
		cout << "接收到的数据:" << buff << endl;
		if (memcmp(buff, "playmusic", strlen("playmusic")) == 0) 
		{
			mciSendString(TEXT("open Back_To_Me-Vanotek-44303614.mp3"), NULL, 0, NULL);
			mciSendString(TEXT("play Back_To_Me-Vanotek-44303614.mp3"), NULL, 0, NULL);
		}
	}
	return 0;
}

六、演示

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法专题--链表】两数相加 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐双指针 -- 模拟进位 (使用哨兵位头节点) &#x1f95d; 什么是哨兵位头节点&#xff1f; &#x1f347;思路解析 &#x1f34d;案例图解 四、总结与提炼 五、共勉 一、前言 两数相加 这道题&#xff0c;可以说是--…

Linux Swap

Swap: 页面换出&#xff1a;就是在 Swap 机制下&#xff0c;当内存资源紧张时&#xff0c;内核就会把不经常使用的这些匿名页中的数据写入到 Swap 分区或者 Swap 文件中。从而释放这些数据所占用的内存空间。 页面换入&#xff1a;就是当进程再次访问那些被换出的数据时&…

如何修复Power BI【View usage metrics report】指标报表数据源更新问题?

故事背景 有朋友留言询问&#xff1a;通过我之前写的 想知道Power BI用户访问报告的次数&#xff1f;快来学习&#xff01; 这篇文章&#xff0c;了解了如何查看Power BI用户访问报告的详情。 但是最近由于创建【View usage metrics report】指标报表的小伙伴离职了&#x…

【数据可视化技术】1、如何使用Matplotlib和Seaborn库在Python中绘制热力图

热力图是一种数据可视化技术&#xff0c;可以显示变量之间的相关性。这个代码段是数据分析和可视化的常用方法&#xff0c;特别适合于展示变量之间的相关性&#xff0c;对于数据科学和机器学习项目非常有帮助。 1、 导入必要的库 首先&#xff0c;确保你已经安装了matplotlib…

苏州网站建设好做吗

苏州网站建设是一个非常热门的行业&#xff0c;由于苏州地理位置优越、经济发达、人口众多&#xff0c;所以网站建设市场也非常火爆。但是在苏州网站建设这个行业中&#xff0c;竞争也是非常激烈的&#xff0c;所以想要在这个市场中脱颖而出并不是件容易的事情。 首先&#xff…

break和continue的标签使用

break标签的使用 break label是退出label对应的循环 //BreakDetail.java //2024.06.29 public class BreakDetail{public static void main(String[] args) {label1:for(int j 0; j < 4; j){label2:for(int i 0; i < 10; i){if(i 2){//break; //情况1//break label2…

信息系统项目管理师(项目整合管理)补充

项目管理信息系统&#xff1a;给项目提供了IT软件工具&#xff0c;例如进度计划软件工具、工作授权系统、配置管理系统、信息收集与发布系统&#xff0c;或其他基于IT技术的工具。以及进入其他在线信息系统&#xff08;如知识库&#xff09;的登录界面&#xff0c;支持自动收集…

应用部署方式演变

应用部署方式演变 1.传统部署2.虚拟化部署3.容器化部署 1.传统部署 传统的应用程序部署是将多个应用程序直接部署在操作系统上&#xff0c;一旦其中的某个应用程序出现内存泄漏&#xff0c;那么该程序就会大量吞噬系统内容空间&#xff0c;导致其他应用程序无法正常运行。 2.虚…

docker 学习之路

文章目录 1、官方文档2、常用命令挂载Docker容器内运行的脚本或命令常用 3、介绍4、Dockerfile5、问题6、链接 ​ 1、官方文档 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux…

人工智能在多模态多组学领域的最新研究进展|顶刊速递·24-06-29

小罗碎碎念 本期推文主题&#xff1a;人工智能在多模态与多组学中的最新研究进展 今天这期推文比较特殊&#xff0c;起来就开始干活&#xff0c;只能跑来会场写了。 小罗观点 今天这期推文覆盖面挺广的&#xff0c;前四篇与肿瘤治疗相关&#xff0c;并且两篇都直接与免疫微环境…

【算法学习】射线法判断点在多边形内外(C#)以及确定内外两点连线与边界的交点

1.前言&#xff1a; 在GIS开发中&#xff0c;经常会遇到确定一个坐标点是否在一块区域的内部这一问题。 如果这个问题不是一个单纯的数学问题&#xff0c;例如&#xff1a;在判断DEM、二维图像像素点、3D点云点等含有自身特征信息的这些点是否在一个区域范围内部的时候&#x…

eclipse基础工程配置( tomcat配置JRE环境)

文章目录 I eclipse1.1 工程配置1.2 编译工程1.3 添加 JRE for the project build pathII tomcat配置JRE环境2.1 Eclipse编辑tomcat运行环境(Mac版本)2.2 Eclipse编辑tomcat运行环境(windows版本)2.3 通过tomcat7W.exe配置运行环境(windows系统)I eclipse 1.1 工程配置 …

C++笔记:实现一个字符串类(构造函数、拷贝构造函数、拷贝赋值函数)

实现一个字符串类String&#xff0c;为其提供可接受C风格字符串的构造函数、析构函数、拷贝构造函数和拷贝赋值函数。 声明依赖文件 其中ostream库用于打印标准输入输出&#xff0c;cstring库为C风格的字符串库 #include <iostream> #include <cstring> 声明命…

Matplotlib绘制并列的条形图:每个类别有多个条形并排显示

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

大语言模型LLM基础:推理/不同模型/量化对显存、推理速度和性能的影响

通过本文&#xff0c;你将了解以下几个方面的内容&#xff1a; 要运行一个LLM需要多少显存&#xff1f;&#xff08;我的GPU可以运行多大LLM&#xff1f;&#xff09;不同LLM推理速度如何&#xff1f;量化对显存、推理速度和性能的影响&#xff1f;vLLM、DeepSeed等工具的加速…

您还在为企业无公网独立IP而烦恼吗?

#IBCS虚拟专线# 企业对于高效、稳定且经济实惠的网络解决方案的需求愈发迫切。作为一家企业的技术负责人&#xff0c;我有幸接触并采用了 IBCS 虚拟专线&#xff0c;它的出现&#xff0c;犹如一道曙光&#xff0c;解决了我们长期以来面临的诸多网络难题。 我们企业是一家处于…

visual studio 2022配置和使用jsoncpp

下载 jsoncpp下载位置&#xff1a; GitHub - open-source-parsers/jsoncpp: A C library for interacting with JSON. 编译库 1、下载完成之后解压 2、在解压文件的makefiles文件下有个vs71&#xff0c;在vs71中有visual studio项目&#xff0c;不过这里的项目是visual stud…

用通俗易懂方式讲解:大模型 ChatGLM3 进行 LORA 高效微调全流程

本章我们以 ChatGLM3 为例&#xff0c;对 ChatGLM3-6B 模型进行 LORA 高效微调。 本章尽量用最简洁的语言及方法对大模型进行微调实际操练。 什么是 LORA 高效微调&#xff1a; lora微调原理论文&#xff1a; https://arxiv.org/abs/2106.09685 用最简单的语言理解LORA高效…

TCP/IP模型原理(理论)

TCP/IP模型 1. 网络模型简介2. 应用层2.1 URL2.1.1 urlencode和urldecode 2.2 HTTP协议2.2.1 HTTP协议格式2.2.2 HTTP问题2.2.3 HTTPS 3 传输层3.1 端口号3.2 udp3.2.1 udp协议帧格式3.2.2 udp特点3.2.3 udp缓冲区3.2.4 注意 3.3 tcp协议3.3.1 tcp协议段格式3.3.2 确认应答机制…

UE4_材质_水体的反射与折射制作_Ben教程

在这个教程中&#xff0c;将制作水的反射和折射&#xff0c;上个教程&#xff0c;我们主要讲了制作水涟漪&#xff08;水面波纹&#xff09;和水滴法线混合&#xff0c;水深计算&#xff0c;我们首先要谈的是反射和产生折射的问题。我们将所有从干扰从场景中分离出去&#xff0…