Russian Qt Forum
Ноябрь 24, 2024, 06:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Про устойчивость сокетов  (Прочитано 4805 раз)
Ced
Гость
« : Май 24, 2017, 14:14 »

Допустим, есть два процесса, обменивающиеся информацией через сокет.
Вопрос первый:
Если процесс-приемник упал, может ли это приводить к падению процесса-источника в ходе записи данных в сокет?
Вопрос второй:
Протокол обмена организован так: Процесс-источник пишет в сокет длину передаваемого блока и за тем сам блок. Процесс-приемник считывает длину, за тем запрашивает у сокета наличие данных для считывания в таком количестве и, если получил подтверждение, читает.
Если процесс-источник упал в ходе записи блока в сокет, может ли это привести к падению процесса-приемника?
Код:
void MyServer::sendToClient(/*QTcpSocket*/ QIODevice *pSocket, Message *toSend)
{
    QByteArray arrBlock;
    QDataStream out(&arrBlock, QIODevice::WriteOnly);

    out.setVersion (QDataStream::Qt_4_8);
    out << quint16 (0) << QTime::currentTime() << *toSend;
    out.device ()->seek (0);
    out << quint16 (arrBlock.size()- sizeof(quint16));

    pSocket->write (arrBlock);
    pSocket->waitForBytesWritten (50);
}

void MyClient::slotReadyRead ()
{
    QDataStream in (m_pTcpSocket);
    in.setVersion (QDataStream::Qt_5_3);
    for (;;)
    {
        if (!m_nNextBlockSize)
        {
            if (m_pTcpSocket->bytesAvailable() < sizeof(quint16))
                break;
            in >> m_nNextBlockSize;
        }
        if (/*dataAvailable*/m_pTcpSocket->bytesAvailable() < m_nNextBlockSize)
            break;
        QTime mytime;
        QString str = mytime.toString();
        in >> mytime >> *lastMessage;
.....
}
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Май 24, 2017, 14:34 »

>Если процесс-приемник упал, может ли это приводить к падению процесса-источника в ходе записи данных в сокет?
Нет.

>Если процесс-источник упал в ходе записи блока в сокет, может ли это привести к падению процесса-приемника?
Смотря как ты его напишешь. По-нормальному, он должен ждать полного блока данных. Если сокет рвется, он должен корректно это обработать.

PS: код не смотрел.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Ced
Гость
« Ответ #2 : Май 24, 2017, 14:48 »

>Если процесс-приемник упал, может ли это приводить к падению процесса-источника в ходе записи данных в сокет?
Нет.

>Если процесс-источник упал в ходе записи блока в сокет, может ли это привести к падению процесса-приемника?
Смотря как ты его напишешь. По-нормальному, он должен ждать полного блока данных. Если сокет рвется, он должен корректно это обработать.

PS: код не смотрел.

Текст обмена я привел выше. Мне кажется. там есть защита от неполного блока. Или я чего-то не предусмотрел?
Самое противное в этой истории то, что если в работу не вмешиваться, все работает, как часики, стоит приостановить источник, приемник мгновенно падает по RunTime. А если пытаюсь смотреть в дебагере, приемник сообщает  о потере связи с источником и не думает падать.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Май 24, 2017, 15:22 »

1. Ты весь код приемника привел.
2. По тому коду, что я вижу - работа с сокетами некорректная, не должно быть бесконечного цикла.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Ced
Гость
« Ответ #4 : Май 24, 2017, 16:47 »

1. Ты весь код приемника привел.
2. По тому коду, что я вижу - работа с сокетами некорректная, не должно быть бесконечного цикла.

Понял, подумаю над этим.
Записан
Ced
Гость
« Ответ #5 : Май 24, 2017, 17:11 »

И все же валится он не при чтении, а при записи. И что погано, под дебагером не валится.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #6 : Май 25, 2017, 08:26 »

ничего не должно падать, ошибка гдето в коде
Записан
Ced
Гость
« Ответ #7 : Май 25, 2017, 18:41 »

ничего не должно падать, ошибка гдето в коде

В итоге научился обрабатывать в одном процессе падение другого и все стало стабильно. А причину так и не нашел.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 22.