– 固长数据:
- 我发送的多长的数据每次都是固定的,就这么多这么长
- 变长数据:
比如我要发送一个图片,每次的图片大小都不一样,但是发送的格式是相同的
图片本身数据的长度都不一样,这个时候我们人为的变长数据
像这样发送的时候我们就要指定我们发送的数据有多长
而之前DataHeader固长数据这样的方式不明显,只有在数据结构一样但是长度不一样的时候DataHeader才会有作用
代码修改:
- server
while (true)
{
// 缓冲区(固定长度数据)
// 把收到的消息放到一个缓冲区里面
char szRecv[1024] = {}; // 一次性数据来收,每次收的数据保存在缓冲区里面
int ret = recv(_client_sock, szRecv, sizeof(DataHeader), 0);
DataHeader* header = (DataHeader*)szRecv;
if (ret <= 0)
{
cout << "client exit...." << endl;
break;
}
// 取得息头
switch (header->cmd)
{
case CMD_LOGIN:
{
// 再取剩余的长度,然后在放去对应的包体里面
// 这里取剩余的长度,把剩余放进对应的消息体里面
recv(_client_sock, szRecv + sizeof(DataHeader), header->dataLength - sizeof(DataHeader), 0);
Login* login = (Login*)szRecv;
cout << "接收数据 : CMD_LOGIN ...."<< ", 数据长度 : " << login->dataLength;
cout << " : userName = " << login->UserName;
cout << " : PassWord = " << login->PassWord << endl;
// LoginResult ret = { CMD_LOGIN }; // 就不能这样初始化了 因为是一个类了
LoginResult ret;
send(_client_sock, (char*)&ret, sizeof(LoginResult), 0);
}
break;
case CMD_LOGOUT:
{
recv(_client_sock, szRecv + sizeof(DataHeader), header->dataLength - sizeof(DataHeader), 0);
Logout* logout = (Logout*)szRecv;
cout << "接收数据 : CMD_LOGOUT ...." << ", 数据长度 : " << logout->dataLength;
cout << " : userName = " << logout->UserName << endl;;
LogoutResult ret;
send(_client_sock, (char*)&ret, sizeof(ret), 0);
}
break;
default:
DataHeader header = { 0, CMD_ERROR };
send(_client_sock, (char*)&header, sizeof(DataHeader), 0);
break;
}
}
-------------------------------- the end ----------------------------------