Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Ced от Май 24, 2017, 14:14



Название: Про устойчивость сокетов
Отправлено: 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;
.....
}


Название: Re: Про устойчивость сокетов
Отправлено: Пантер от Май 24, 2017, 14:34
>Если процесс-приемник упал, может ли это приводить к падению процесса-источника в ходе записи данных в сокет?
Нет.

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

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


Название: Re: Про устойчивость сокетов
Отправлено: Ced от Май 24, 2017, 14:48
>Если процесс-приемник упал, может ли это приводить к падению процесса-источника в ходе записи данных в сокет?
Нет.

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

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

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


Название: Re: Про устойчивость сокетов
Отправлено: Пантер от Май 24, 2017, 15:22
1. Ты весь код приемника привел.
2. По тому коду, что я вижу - работа с сокетами некорректная, не должно быть бесконечного цикла.


Название: Re: Про устойчивость сокетов
Отправлено: Ced от Май 24, 2017, 16:47
1. Ты весь код приемника привел.
2. По тому коду, что я вижу - работа с сокетами некорректная, не должно быть бесконечного цикла.

Понял, подумаю над этим.


Название: Re: Про устойчивость сокетов
Отправлено: Ced от Май 24, 2017, 17:11
И все же валится он не при чтении, а при записи. И что погано, под дебагером не валится.


Название: Re: Про устойчивость сокетов
Отправлено: qate от Май 25, 2017, 08:26
ничего не должно падать, ошибка гдето в коде


Название: Re: Про устойчивость сокетов
Отправлено: Ced от Май 25, 2017, 18:41
ничего не должно падать, ошибка гдето в коде

В итоге научился обрабатывать в одном процессе падение другого и все стало стабильно. А причину так и не нашел.