将整数从C中的TCP套接字发送到Qt TCP套接字

时间:2018-11-30 16:27:41

标签: c++ qt sockets

我目前正在尝试使用TCP套接字实现基本的客户端-服务器文件传输程序。使用C ++ / Qt编写客户端,使用C编写服务器。 尝试将文件大小从服务器发送到客户端时遇到很大的困难(整数值)。下面是代码示例。

C服务器:

if(fileExists == '1')
{
   fp = fopen(filename, "r");
   fseek(fp, 0L, SEEK_END);
   fileSize = ftell(fp);
   printf("%d\n", fileSize);
   send(client_socket, &fileSize, sizeof(fileSize), 0);
}

Qt客户端:

void Client::receiveFile(QString filename)
{
    qint32 fileSize;
    clientSocket->waitForReadyRead(1000);
    clientSocket->read(fileSize);
    qDebug() << fileSize;
}

问题在于C正确地计算出文件大小为40435408,并将其发送给客户端,该文件的大小为32767。显而易见,问题出在客户端。我几乎一整天都想找出问题所在,但失败了。 我意识到这是我犯的一些简单而愚蠢的错误,对于提出这样愚蠢的问题我深表歉意。我是一个完整的初学者。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

当您致电clientSocket->read(fileSize);时,实际上是在致电QByteArray QIODevice::read(qint64 maxSize)。这意味着您正在从TCP套接字读取多达undefined(因为fileSize未初始化)的字节数,并立即丢弃它,因为您不使用返回值。

我认为您正在尝试使用qint64 QIODevice::read(char *data, qint64 maxSize),因此您的代码应如下所示:

qint32 fileSize = 0;
clientSocket->waitForReadyRead(1000);
if (clientSocket->bytesAvailable() >= sizeof(fileSize)) {
    clientSocket->read(&fileSize, sizeof(fileSize));
} else {
    qWarning() < "Only received" << clientSocket->bytesAvailable() << "bytes: " << clientSocket->readAll().toHex(' ');
}
qDebug() << fileSize;

请注意,我不会在除概念验证之外的任何软件中使用此代码。