【发布时间】:2017-08-01 04:47:15
【问题描述】:
我需要在套接字中逐字节传输音频文件,在接收端我需要正确安排它。例如,有两个音频文件 A 和 B,我必须从 A 读取一个字节并传输,接下来我必须从 B 读取第一个字节并传输,然后从 A 读取第二个字节,从 B 读取第二个字节,这样传输有要在 EOF 之前完成,在接收方我必须为 A 和 B 组织正确接收的字节。
我在 TCP 套接字中的 C++(Qt) 中为一个音频文件尝试了上述方法。
QString path = "a4.wav";
QFile inputFile(path);
inputFile.open(QIODevice::ReadOnly);
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_5_4);
QByteArray q = inputFile.readAll();
block.append(q);
inputFile.close();
out.device()->seek(0);
qint32 x = 0;
unsigned int i = 0;
while (x < block.size()) {
qint32 y = socket->write(&block.data()[i],1); //Filling one byte in socket to write
x += y;
//qDebug() << y;
//qDebug() << x; // summary size you send, so you can check recieved and replied sizes
i++;
}
但是在上面的代码中,我正在填充和写入一个字节,但是接收方我得到了一堆字节(例如接收 14000 字节)。似乎写套接字中的缓冲区已填满,然后才发生传输。我必须做什么,一次只写一个字节?
【问题讨论】:
-
为什么要将文件读入字节数组 q 然后将其复制到块中?你为什么要打开 DataStream 'out'?
-
没有人对每个数据包执行 TCP 一个字节。 TCP 是一种流,因此网络设备可以根据需要对其进行切片和粘合。可以使用 UDP,但仍然会浪费,因为对于每个字节,您还发送了 20 到 40 字节长的数据包头。
标签: c++ qt byte transfer qtcpsocket