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

目录

一、Visual Sudio 2022

二、配置

三、说明

四、客户端

五、服务端

六、演示


一、Visual Sudio 2022

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

  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;
}

六、演示

  • 28
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个简单的基于TCP协议的客户端和服务器代码示例,可以定时收发消息。在客户端和服务器端之间进行双向通信,每隔1秒发送一条消息: 服务端代码: ```cpp #include <iostream> #include <string> #include <cstdlib> #include <ctime> #include <cstring> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <unistd.h> #define PORT 8080 #define MAX_BUFFER_SIZE 1024 int main() { std::cout << "Starting server..." << std::endl; // 创建socket文件描述符 int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { std::cerr << "Failed to create socket" << std::endl; exit(EXIT_FAILURE); } // 设置server地址信息 sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(PORT); // 绑定socket到指定地址和端口 if (bind(server_fd, (sockaddr *)&server_addr, sizeof(server_addr)) == -1) { std::cerr << "Failed to bind socket to address" << std::endl; exit(EXIT_FAILURE); } // 监听socket if (listen(server_fd, 10) == -1) { std::cerr << "Failed to listen on socket" << std::endl; exit(EXIT_FAILURE); } std::cout << "Server listening on port " << PORT << std::endl; // 处理连接请求 while (true) { sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); // 接受连接请求 int client_fd = accept(server_fd, (sockaddr *)&client_addr, &client_addr_len); if (client_fd == -1) { std::cerr << "Failed to accept connection" << std::endl; continue; } std::cout << "Accepted new connection from " << inet_ntoa(client_addr.sin_addr) << std::endl; // 处理客户端请求 while (true) { char buffer[MAX_BUFFER_SIZE] = {0}; int bytes_read = read(client_fd, buffer, MAX_BUFFER_SIZE); if (bytes_read == -1) { std::cerr << "Failed to read from socket" << std::endl; break; } if (bytes_read == 0) { std::cout << "Connection closed by client" << std::endl; break; } std::cout << "Received message: " << buffer << std::endl; // 发送回复消息 std::string reply_message = "Received message: "; reply_message.append(buffer); write(client_fd, reply_message.c_str(), reply_message.length()); } // 关闭客户端连接 close(client_fd); } // 关闭服务器socket close(server_fd); return 0; } ``` 客户端代码: ```cpp #include <iostream> #include <string> #include <cstdlib> #include <ctime> #include <cstring> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <netdb.h> #define PORT 8080 #define MAX_BUFFER_SIZE 1024 int main() { std::cout << "Starting client..." << std::endl; // 创建socket文件描述符 int client_fd = socket(AF_INET, SOCK_STREAM, 0); if (client_fd == -1) { std::cerr << "Failed to create socket" << std::endl; exit(EXIT_FAILURE); } // 设置server地址信息 sockaddr_in server_addr; memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(PORT); // 解析server地址 struct hostent *host = gethostbyname("localhost"); if (host == NULL) { std::cerr << "Failed to resolve server address" << std::endl; exit(EXIT_FAILURE); } server_addr.sin_addr = *((in_addr *)host->h_addr); // 连接到server if (connect(client_fd, (sockaddr *)&server_addr, sizeof(server_addr)) == -1) { std::cerr << "Failed to connect to server" << std::endl; exit(EXIT_FAILURE); } std::cout << "Connected to server on port " << PORT << std::endl; // 发送和接收消息 while (true) { // 发送消息 std::string message = "Hello, server!"; write(client_fd, message.c_str(), message.length()); std::cout << "Sent message: " << message << std::endl; // 接收回复消息 char buffer[MAX_BUFFER_SIZE] = {0}; int bytes_read = read(client_fd, buffer, MAX_BUFFER_SIZE); if (bytes_read == -1) { std::cerr << "Failed to read from socket" << std::endl; break; } if (bytes_read == 0) { std::cout << "Connection closed by server" << std::endl; break; } std::cout << "Received message: " << buffer << std::endl; // 等待1秒 sleep(1); } // 关闭socket close(client_fd); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值