Cpp-Socket网络编程(七)网络消息接收长度问题
作者:互联网
在复杂网络环境下,网络消息的长度并不总是固定的,网络数据包可分为固长数据、变长数据、粘包/拆包、少包/组包等情况。其中,粘包指,例如每次发送500字节数据到客户端或者服务端,但是由于网络延迟等原因,服务器端可能一次收到两个消息,即1000字节,也就是网络数据包粘在一起了,因此需要一个拆包的过程;分包指,例如一次发送1000字节数据,服务器端接收的时候,一开始只接收到500字节的数据,那么服务器端就要等待剩余数据传递过来才能进行处理。
为了使程序更好地适应不同地数据长度,可以修改服务器端的代码,使用datalength标识当前数据的长度。
//6. 处理请求
switch (header->cmd) {
case CMD_LOGIN:
{
recv(_cSock, szRecv + sizeof(DataHeader), header->dataLength - sizeof(DataHeader), 0);
Login* login = (Login*)szRecv;
//接收客户端的登陆信息,这里要注意除去headerd部分,因此要加上数据偏移,并且读取范围要减去header的大小
printf("receive message: CMD_LOGIN, data length:%d, username:%s, password: %s\n", login->dataLength, login->UserName, login->PassWord); //提示收到命令
//假设用户输入正确(这里忽略用户名和密码是否正确的验证过程)
LoginResult inret;
//7. 向客户端发送数据send
send(_cSock, (char*)&inret, sizeof(LoginResult), 0); //向客户端发送登陆结果
}
break;
case CMD_LOGOUT:
{
recv(_cSock, szRecv + sizeof(DataHeader), header->dataLength - sizeof(DataHeader), 0);
LogOut* logout;
printf("receive message: CMD_LOGIN, data length:%d, username:%s\n", logout->dataLength, logout->UserName);
LogoutResult outret;
//7. 向客户端发送数据send
send(_cSock, (char*)&outret, sizeof(LogoutResult), 0);
}
break;
default:
{
DataHeader header = {0, CMD_ERROR};
send(_cSock, (char*)&header, sizeof(DataHeader), 0);
}
break;
}
标签:Socket,CMD,cSock,网络,send,header,DataHeader,Cpp,sizeof 来源: https://blog.csdn.net/ljytower/article/details/97534117