Обрыв соединения QTcpSocket |
Здравствуйте, гость ( Вход | Регистрация )
Обрыв соединения QTcpSocket |
BRE |
17.2.2010, 11:39
Сообщение
#11
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Ну так если ты хочешь отправлять синхронно, то попробуй вместо flush крутить цикл обработки событий.
|
|
|
OrSOn |
17.2.2010, 11:45
Сообщение
#12
|
Студент Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: 0 |
Боюсь, что так будет не лучше, ибо сложнее отследить, когда данные передались полностью... Понять бы, как тут избежать вылетов..
|
|
|
BRE |
17.2.2010, 12:11
Сообщение
#13
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Как только ты записал последний кусок данных в сокет и метод write это подтвердил.
Дальше забота Qt. |
|
|
OrSOn |
17.2.2010, 14:50
Сообщение
#14
|
Студент Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: 0 |
Попробовал, ничего не вышло... Вот код:
Результат, как я и говорил, плачевный - в сокет НИЧЕГО не передается, вообще ничего... Без flush() упорно отказывается отсылать |
|
|
BRE |
17.2.2010, 16:29
Сообщение
#15
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Набросал небольшой пример (клиент/сервер) для передачи больших файлов. Вроде все работает, даже если клиент посылает запрос и выходит, не дожидаясь чтения файла.
В файле сервера укажи имя существующего большого файла.
Прикрепленные файлы
|
|
|
OrSOn |
17.2.2010, 17:12
Сообщение
#16
|
Студент Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: 0 |
Спасибо, сейчас гляну
Что-то я не совсем понял... int writed = write( buf ); - грубо говоря, записали и проверили, сколько именно записалось.. Но ведь нету проверки, что записалось ВСЕ, вдруг часть не записалась... Просто проблема в том, что размер блока может быть переменным и если сделать его, скажем, пару мегабайт, все может сломаться... |
|
|
BRE |
17.2.2010, 17:23
Сообщение
#17
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
int writed = write( buf ); - грубо говоря, записали и проверили, сколько именно записалось.. Но ведь нету проверки, что записалось ВСЕ, вдруг часть не записалась... Просто проблема в том, что размер блока может быть переменным и если сделать его, скажем, пару мегабайт, все может сломаться... Данные попали в буфер отправки tcp-стека, дальше это проблема стека. Если какой-то пакет потеряется, то сам протокол пере-пошлет его еще раз. Для подтверждения же доставки всех данных, другая сторона (твой клиент) может отправить пакет твоему серверу, что бы он "успокоился". Насчет моего кода.... Я там упростился, хотя так делать не совсем правильно. Я отправляю размер файла (переменную int) как массив char. Если архитектура на принимающей стороне будет отличаться типом хранения (byte order), то размер будет неверным. Поэтому для всех подобных передач, желательно использовать QDataStream. Сообщение отредактировал BRE - 17.2.2010, 17:28 |
|
|
OrSOn |
18.2.2010, 13:15
Сообщение
#18
|
Студент Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: 0 |
Попробовал, но, увы, этот вариант врядли прокатит( Получается, что сначала ВЕСЬ файл записывается в сокет, а только потом клиент начинает его принимать.. А в том и проблема, именно потому и было решено отправлять файлы блоками, что в случае, если на компьютере гигабайт оперативки, а файл больше гигабайта, то он просто не уместится в память и его нельзя будет даже считать... Как и тут передать...
|
|
|
BRE |
18.2.2010, 14:33
Сообщение
#19
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
OrSOn |
18.2.2010, 14:35
Сообщение
#20
|
Студент Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: 0 |
ну не знаю, я запускал в дебаге твой пример, так там клиент висел "без данных", пока сервер не переслал все полностью..
|
|
|
Текстовая версия | Сейчас: 4.12.2024, 22:40 |