编程语言
首页 > 编程语言> > Cpp-Socket网络编程(七)网络消息接收长度问题

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