Обрыв соединения QTcpSocket |
Здравствуйте, гость ( Вход | Регистрация )
Обрыв соединения QTcpSocket |
OrSOn |
16.2.2010, 14:47
Сообщение
#1
|
Студент Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем добрый день! Столкнулся с довольно неприятной проблемой при работе с сокетами... Суть проблемы в следующем:
Имеется сервер и клиент, для общения используют сокеты. В некий момент времени клиент рушится (ну или связь падает, не суть важно), при этом сервер пытается что-то писать в сокет, что приводит к ошибке. Чтобы избежать этого, пробовал ввести проверку
Так вот случаются ситуации, что проверка состояния проходит, а сразу после нее до начала проталкивания информации клиент падает и на tcpSocket->flush() снова вылетаю с ошибкой. Если кто сталкивался с подобным, подскажите, пожалуйста, как это можно обойти... Сообщение отредактировал OrSOn - 16.2.2010, 14:48 |
|
|
OrSOn |
17.2.2010, 17:12
Сообщение
#2
|
Студент Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: 0 |
Спасибо, сейчас гляну
Что-то я не совсем понял... int writed = write( buf ); - грубо говоря, записали и проверили, сколько именно записалось.. Но ведь нету проверки, что записалось ВСЕ, вдруг часть не записалась... Просто проблема в том, что размер блока может быть переменным и если сделать его, скажем, пару мегабайт, все может сломаться... |
|
|
BRE |
17.2.2010, 17:23
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
int writed = write( buf ); - грубо говоря, записали и проверили, сколько именно записалось.. Но ведь нету проверки, что записалось ВСЕ, вдруг часть не записалась... Просто проблема в том, что размер блока может быть переменным и если сделать его, скажем, пару мегабайт, все может сломаться... Данные попали в буфер отправки tcp-стека, дальше это проблема стека. Если какой-то пакет потеряется, то сам протокол пере-пошлет его еще раз. Для подтверждения же доставки всех данных, другая сторона (твой клиент) может отправить пакет твоему серверу, что бы он "успокоился". Насчет моего кода.... Я там упростился, хотя так делать не совсем правильно. Я отправляю размер файла (переменную int) как массив char. Если архитектура на принимающей стороне будет отличаться типом хранения (byte order), то размер будет неверным. Поэтому для всех подобных передач, желательно использовать QDataStream. Сообщение отредактировал BRE - 17.2.2010, 17:28 |
|
|
Текстовая версия | Сейчас: 11.12.2024, 10:46 |