crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> "Склеивание" сообщений ТСР
pwp2008
  опции профиля:
сообщение 19.10.2015, 19:31
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 19.12.2014
Пользователь №: 4299

Спасибо сказали: 0 раз(а)




Репутация:   0  


Подскажите пож-та, встречалось ли Вам отправленные друг за другом сообщения (клиентом) получать в сервере "склееном" виде, как если бы это было одно сообщение. В чем причина такой работы по протоколу TCP\IP ? Разрулить эту проблему удалось несколько искусственным способом, хотя здесь может подойти и передача длины сообщения и/или контрольный суммы. Видимо так склеены могут быть не 2, а даже больше последовательных сообщений.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ViGOur
  опции профиля:
сообщение 28.10.2015, 9:41
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


1. Почему нет? Ты можешь считать за один раз сколько тебе нужно, а там уже разобрать эти данные на 1 байт + данные + склеенное сообщение (если будет и отправить склеенной для следующего разбора)
2. Синхронизация, используй QMutex, чтобы пока один поток не отработал, другой не вошел для чтения.

Метод recv был для примера, ты можешь так же в место него использовать read... :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pwp2008
  опции профиля:
сообщение 29.10.2015, 19:14
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 29
Регистрация: 19.12.2014
Пользователь №: 4299

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(ViGOur @ 28.10.2015, 9:41) *
1. Почему нет? Ты можешь считать за один раз сколько тебе нужно, а там уже разобрать эти данные на 1 байт + данные + склеенное сообщение (если будет и отправить склеенной для следующего разбора)

----------------------------------------------------------------------------------------
По обработке склеенных\разделенных блоков ТСР в Qt 4.5. Привожу лишь существенный код.
Файл - mainwin_02.h
class MainWin_02 : public QMainWindow
{
    Q_OBJECT
public:
    QByteArray srv_R1;   // для ответа сервера
    QQueue <QByteArray> queueMsg;
    void handleQueue();
    bool f_queue;
..........................
public slots:
    void slotGetResponse();
};

Файл - mainwin_02.cpp
MainWin_02::MainWin_02(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWin_02)
{
................................................
//------------------------------------
    // Описание сокета.
    m_pTcpSocket = new QTcpSocket(this);
    connect(m_pTcpSocket,SIGNAL(connected()),SLOT(slotConnected()));
    connect(m_pTcpSocket,SIGNAL(readyRead()),SLOT(slotGetResponse()));
//------------------------------------
void MainWin_02::slotGetResponse()
{
    // читаем склееные и неполные сообщения по сигналу SIGNAL(readyRead()
    int k1,tLen;
    int kk = m_pTcpSocket->bytesAvailable();
    tLen = kk;
    bool f_queue = false;    // признак постановки в очередь
    while (tLen >0) {
        srv_R1.clear();
        srv_R1 = m_pTcpSocket->peek(1);
        k1= srv_R1[0];
        if (tLen >=k1) {
            srv_R1.clear();
            srv_R1 = m_pTcpSocket->read(k1+1);  // читаем вместе с длиной
            tLen = tLen-(k1+1);
            queueMsg.enqueue(srv_R1);               // пишем в очередь
            f_queue = true;
        } else break;    // выйдем, если неполное сообщение и ждем остаток
    }
    if (f_queue) {
        // выполнить обработку очереди
        handleQueue();
    }
}
void MainWin_02::handleQueue()
{
    // обработка очереди сообщений
    while (!queueMsg.isEmpty()) {
        srv_R3.clear();
        srv_R3 = queueMsg.dequeue();
        // далее обработка сообщения ..................................
        qDebug() << "r3="<< srv_R3.toHex() <<srv_R3.data()<< "ostatok="<<queueMsg.count();
    }
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.11.2024, 22:02