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 进行传输,以避免类似的转换问题。
Qt 客户端与 C++ 服务器通信:解决 userid 转换问题

原文地址: http://www.cveoy.top/t/topic/fCuk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录