Название: Не сохраняются данные из сокета Отправлено: rudolfninja от Декабрь 16, 2013, 21:41 Доброго времени суток. У меня вопрос до боли заезженный на этом форуме, собственно, отсюда и брал код реализации.
Проблема вот в чем. Есть клиент. Он может передавать файл ( > 100 Мб) другому клиенту. Передача происходит в отдельном потоке. Передается файл нормально, а вот собрать его не получается. Программа зависает на 99% приема. Код обработчика на отправку файла: Код: void MainWindow::slot_send_file_menu_handler() Код: void MainWindow::slot_new_connection() Код: void SendFileThread::set_params(QTcpSocket *socket, QString path) Код: void MainWindow::slot_info_menu_handler() Код: QTcpSocket* _socket = ((QTcpSocket*)sender()); Подскажите, пожалуйста, в чем может быть проблема и как ее решить? Спасибо. Название: Re: Не сохраняются данные из сокета Отправлено: Fregloin от Декабрь 17, 2013, 11:17 проблема в неправильном подходе. вообще если вы решили использовать QDataStream посмотрите пример FortuneServer. Во вторых, данные могут приходить произвольными порциями,а не по 1023 байта как выхотите. Слать сначала размер и название файла и ожидать что после все данные будут идти равными порциями не стоит. По хорошему нужно слать какой то заголовок (структуру), в которой передавать размер и прочую полезную инфу, далее читать данные с сокета и проверять что данные пришли все. А еще лучше в конце тоже слать какойто признак, что данных больше нет. Вот после прочения этого признака конца нужно делать что файл принят целиком. Ну и таймауты приема желательно использовать тоже, т.к. в зависимости от состояния сети и ее топологии данные могут блуждать долго или вообще теряться (например плохое соединение и данные приходят обрывками). Можно еще как делать, слать порцию данных, а в ответ слать отвкет - принято столькото байт, и пока не пришел ответ от клиента, нет нужды слать следующую часть. Передача конечно заметлится, зато достоверность повысится.
Название: Re: Не сохраняются данные из сокета Отправлено: rudolfninja от Декабрь 17, 2013, 12:02 По хорошему нужно слать какой то заголовок (структуру), в которой передавать размер и прочую полезную инфу, далее читать данные с сокета и проверять что данные пришли все. А еще лучше в конце тоже слать какойто признак, что данных больше нет. Вот после прочения этого признака конца нужно делать что файл принят целиком. А можете написать небольшой пример всего этого?Название: Re: Не сохраняются данные из сокета Отправлено: Fregloin от Декабрь 18, 2013, 11:38 Ну вы же программист или кто? )
У меня конкретного примера как я написал выше нет, могу скинуть пример сокета, который читает json пакеты. Не знаю, поможет ли в вашем случае, но впринципе идея там похожа на ту что я указывал выше. Название: Re: Не сохраняются данные из сокета Отправлено: rudolfninja от Декабрь 18, 2013, 15:01 Получается, что я =)
Спасибо, гляну. Я делал аналогично этому: http://www.prog.org.ru/topic_10870_15.html (прием и отправку). Удивляет то, что там у людей все работает, а у меня нет =) |