Qt 客户端与 C++ 服务器通信:解决 userid 转换问题
Qt 客户端与 C++ 服务器通信:解决 userid 转换问题
本文将介绍在使用 Qt 客户端与 C++ 服务器通信时遇到的 userid 转换问题,并提供解决方案。
问题描述
在代码中,客户端发送的 userid 是 123,但服务器接收到的却是 2063597568。
问题原因
问题出在客户端发送 userid 时,使用了 QDataStream 进行写入,而服务器接收时直接使用了 recv 函数进行读取。QDataStream 在写入时会添加额外的字节用于数据类型的标识,因此服务器接收到的数据不是纯粹的 int 类型。
解决方案
为了解决这个问题,需要在服务器端也使用 QDataStream 进行读取。
修改服务器端代码如下:
void handleClientRequest(ServerContext *context) {
QByteArray data;
int userid;
// 接收客户端发送的 userid
ssize_t recvSize = recv(context->sockfd, data.data(), sizeof(int), 0);
if (recvSize == -1) {
perror("userid接受失败\nrecv");
return;
}
QDataStream in(&data, QIODevice::ReadOnly);
in >> userid;
if (in.status() != QDataStream::Ok) {
perror("解析userid失败");
return;
}
printf("客户端已连接\n");
printf("%d",userid);
// 其他代码不变
}
修改客户端代码如下:
void Procession::connected()
{
ui->message->append("连接成功");
// 发送userid给服务器
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out << static_cast<qint32>(this->userid);
if (m_socket->write(block) == -1) {
ui->message->append("发送userid失败");
m_socket->close();
}
}
总结
通过使用 QDataStream 进行数据传输,确保客户端发送的 userid 和服务器接收的 userid 保持一致。
其他说明
- 服务器端代码中,可以使用
sizeof(int)获取 int 类型的大小,以确保数据读取正确。 - 客户端代码中,使用
static_cast<qint32>(this->userid)将 int 类型转换为 qint32 类型,以与 QDataStream 的数据类型匹配。 - 确保客户端和服务器端使用的 QDataStream 的数据类型和字节序一致。
- 除了 userid 之外,其他数据类型也需要使用 QDataStream 进行传输,以避免类似的转换问题。
原文地址: http://www.cveoy.top/t/topic/fCuk 著作权归作者所有。请勿转载和采集!