这个函数有一些错误。下面是修正后的代码:
void upload_program::on_toolBtn_upload_clicked() {
// 获得文件名
QString file_path = ui->edit_path->text();
int index = file_path.lastIndexOf("/");
QString file_name = file_path.mid(index + 1);
// 连接服务器
QTcpSocket* socket = new QTcpSocket(this);
socket->connectToHost("192.168.234.100", 2074);
if (!socket->waitForConnected()) {
qDebug() << "Failed to connect to server:" << socket->errorString();
return;
}
// 读取文件内容
QFile file(file_path);
if (!file.open(QIODevice::ReadOnly)) {
qDebug() << "Failed to open file";
return;
}
QByteArray file_content = file.readAll();
qint64 content_len = file_content.size();
file.close();
// 构造数据包
QByteArray packet;
packet.append(char(0xCD)); // 文件传输协议类型
packet.append(qint32(file_name.toUtf8().size())); // 文件名长度
packet.append(file_name.toUtf8()); // 文件名
packet.append(qint64(content_len)); // 文件内容长度
packet.append(file_content); // 文件内容
packet.append(char(0xDC)); // 传输结束
// 发送数据包并接收响应
QByteArray received_data;
if (socket->waitForConnected()) {
socket->write(packet);
if (socket->waitForReadyRead()) {
received_data = socket->readAll();
}
else {
qDebug() << "Failed to receive response";
}
}
else {
qDebug() << "Failed to send packet";
}
// 关闭连接
socket->close();
}
注意:在发送数据包后,应该等待服务器的响应。这里使用了waitForReadyRead()函数来等待响应,如果超时或者出错则会返回false。此外,在使用QFile读取文件内容后,需要用file.close()关闭文件句柄。