QTcpServer - вопрос подтверждения QTcpSocket - PullRequest
0 голосов
/ 06 июля 2011

-> Я пишу программу с использованием QTcpSocket, QTcpServer. Нужно ли мне добавлять код (то есть процедуру подтверждения), чтобы гарантировать доставку пакетов?
Если это так, я не могу найти ничего подобного в сети, поэтому хотел бы увидеть несколько примеров, пожалуйста.

-> Или где-то в библиотеке QT они уже покрыты, так что мне ничего подобного не нужно?

Любая помощь будет оценена. Спасибо.

EDIT: Теперь я спрашиваю, как использовать заголовки с порциями QDataStream, которые я добавил ниже. Я хочу, чтобы у каждого куска были заголовки, сообщающие информацию. Так что я могу отслеживать, какие части написаны, а какие отсутствуют. Пожалуйста, посмотрите ниже.

///RECEIVER SIDE

QDataStream in(socket);
in.setVersion(QDataStream::Qt_4_0);

QByteArray next;
next=socket->readAll(); 

QFile output("c:\\some\\output.txt");
output.open(QIODevice::Append);
output.write(next);
output.close();


///SENDER SIDE
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);

QFile file(path);
if(file.exists()){
         file.open(QIODevice::ReadOnly);    
}

QByteArray data; 
data=file.readAll();
block.append(data);

out << (quint64)0;
out.device()->seek(0);
if(!socket->waitForBytesWritten()){
    qDebug()<<"writing";
 socket->write(block);
 socket->flush();
}


file.close();
qDebug()<<"data: size"<<file.size();
socket->disconnectFromHost();

1 Ответ

2 голосов
/ 07 июля 2011

TCP гарантирует заказанную доставку. Как только вы отправите данные в сокет TCP, стек будет пытаться отправить столько, сколько сможет. Стек использует внутренние подтверждающие сообщения для гарантии доставки.

Таким образом, вам не нужно отправлять подтверждения, однако, неплохо бы реализовать заголовок для ваших пакетов, чтобы принимающая сторона могла правильно объединять небольшие пакеты обратно в огромный файл.

...