我目前正在尝试使用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。显而易见,问题出在客户端。我几乎一整天都想找出问题所在,但失败了。 我意识到这是我犯的一些简单而愚蠢的错误,对于提出这样愚蠢的问题我深表歉意。我是一个完整的初学者。有人可以帮忙吗?
答案 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;
请注意,我不会在除概念验证之外的任何软件中使用此代码。