Russian Qt Forum

Qt => Работа с сетью => Тема начата: mks от Декабрь 10, 2012, 00:10



Название: QTcpSocket сигнал readyRead
Отправлено: mks от Декабрь 10, 2012, 00:10
Добрый день.
Есть tcp соединение. Передатчик с помощью функции QTcpSocket.write() пишет команды вида:
QTcpSocket.write("command1:");
QTcpSocket.write("command2:");
: - это разделитель команд. Правильно я понимаю, что на приёмнике нет гарантии что по сигналу QTcpSocket.readyRead() я получу в приёмном буфере сокета целиком всю последовательность ("command1:"), и в общем случае надо приходящие кусочки данных склеивать в каком-то своём буфере, и там искать команду? Или всё что было записано одним вызовом write придёт без разрывов? Растолкуйте этот момент пожалуйста.  :-\
Заранее спасибо.


Название: Re: QTcpSocket сигнал readyRead
Отправлено: mutineer от Декабрь 10, 2012, 00:16
Протокол TCP не гарантирует, что посылка длинной более одного байта придет сразу вся целиком, поэтому да, тебе надо склеивать в каком-то своем буфере. Ну или делать так, как сделано в примерах Qt: писать сначала длину посылки, затем саму посылку. На принимающей стороне читать сначала размер, а потом ждать пока в сокете будет доступно именно это количество байт и затем уже читать


Название: Re: QTcpSocket сигнал readyRead
Отправлено: k0p4 от Декабрь 13, 2012, 16:18
http://qt-project.org/doc/qt-4.8/qabstractsocket.html#flush


Название: Re: QTcpSocket сигнал readyRead
Отправлено: Igors от Декабрь 13, 2012, 16:59
Ну или делать так, как сделано в примерах Qt: писать сначала длину посылки, затем саму посылку. На принимающей стороне читать сначала размер, а потом ..
Все верно, но этот метод известен задолго до рождения Qt  :) А "или" можно смело убрать - другой разумной схемы здесь не видно


Название: Re: QTcpSocket сигнал readyRead
Отправлено: mks от Декабрь 13, 2012, 17:02
Всем спасибо, разобрался.