2-5 发送结构化的网络消息数据

2-5 发送结构化的网络消息结构

0-前言

【C++百万并发网络通信】系列是跟着【张远东】老师的视频来复现的

希望能通过博客的方式不断坚持学习,也希望偶然间看到这篇博客的你也能一起加油!

笔记目录:【C++百万并发网络通信-笔记目录】

1-结构化消息数据

在客户端与服务端,使用字符串作为消息传输虽然方便理解,但是在传递大量数据时,字符串的解析就是个问题,一般会选择使用JSON、XML、自定义格式的字符数据形式来传递数据

本节使用Cpp中的结构体来传递简易的数据信息

struct DataPackage
{
    
    	
	int age;
	char name[32];
};

注意:如果选择结构体进行消息传输,在服务端与客户端应该使用相同的结构体,具体的变量名称可以不一样,但是变量类型(int、float、char等)必须保持一致,这是为了确保解析命令时的字节顺序一致。同时,还应该确保同一种变量类型在服务端与客户端使用的字节数应该是一样的

我们修改之前版本2-4 建立能持续处理请求的CS程序中的服务端关于【发送数据】部分的程序,利用结构体Datapackage传递消息。注意,send()函数第二个形参要求是const char*类型,这里将结构体做一个强制类型转换

		//6 处理客户端请求,按照请求向客户端发送数据
		if (0 == strcmp(_recvBuf, "getInfo"))
		{
    
    
			DataPackage dp = {
    
     20, "小强" };
			//将结构体转化为const char *传输
			send(_csock, (const char*)&dp, sizeof(DataPackage), 0);
		}
		else
		{
    
    
			char msgBuf[] = "???";
			send(_csock, msgBuf, strlen(msgBuf) + 1, 0);
		}

相应的,需要在客户端修改【接收数据】部分的程序,如下,需要注意的是结构体信息在发送时进行了强制类型转换,在接收时需要转换回来。但是这样有个缺点,就是服务端发送“???”命令时,在客户端同样会被转换为结构体,这里是一处小bug。

		// 6 接收服务器信息 recv
		char recvBuf[128] = {
    
    };//接收数据缓冲区
		int nLen = recv(_sock, recvBuf, 128, 0);//recv()返回接收数据的长度
		if (nLen > 0)
		{
    
    
			//将接收到的二进制文件简易转化
			DataPackage* dp = (DataPackage*)recvBuf;
			cout << "接收到数据:年龄=" << dp->age << " 姓名="
				<< dp->name << endl;
		}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44484715/article/details/112547002
2-5