Обрыв соединения QTcpSocket |
Здравствуйте, гость ( Вход | Регистрация )
Обрыв соединения QTcpSocket |
OrSOn |
16.2.2010, 14:47
Сообщение
#1
|
Студент Группа: Участник Сообщений: 46 Регистрация: 8.12.2009 Пользователь №: 1289 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем добрый день! Столкнулся с довольно неприятной проблемой при работе с сокетами... Суть проблемы в следующем:
Имеется сервер и клиент, для общения используют сокеты. В некий момент времени клиент рушится (ну или связь падает, не суть важно), при этом сервер пытается что-то писать в сокет, что приводит к ошибке. Чтобы избежать этого, пробовал ввести проверку
Так вот случаются ситуации, что проверка состояния проходит, а сразу после нее до начала проталкивания информации клиент падает и на tcpSocket->flush() снова вылетаю с ошибкой. Если кто сталкивался с подобным, подскажите, пожалуйста, как это можно обойти... Сообщение отредактировал OrSOn - 16.2.2010, 14:48 |
|
|
SABROG |
19.2.2010, 16:19
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
А если принимающая сторона (клиент) сидит на узком канале и не успевает выбирать данные, которые ему пихают. В общем QIODevice и так использует QRingBuffer (internal class), поэтому можно просто завести буфер на базе QByteArray для каждого сокета, ловить сигнал bytesWritten() и просить (emit signal) поток подгрузить новую порцию данных, если клиенту были отправлены все данные. Поток сам очистит буффер и поместит следующий блок, затем оповестит (emit signal) об этом сокет. Сокет уже их будет писать, а поток продолжит читать данные из файлов для других сокетов и эмитить им сигналы как прочитает. |
|
|
BRE |
19.2.2010, 16:53
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
В общем QIODevice и так использует QRingBuffer (internal class), поэтому можно просто завести буфер на базе QByteArray для каждого сокета, ловить сигнал bytesWritten() и просить (emit signal) поток подгрузить новую порцию данных, если клиенту были отправлены все данные. Поток сам очистит буффер и поместит следующий блок, затем оповестит (emit signal) об этом сокет. Сокет уже их будет писать, а поток продолжит читать данные из файлов для других сокетов и эмитить им сигналы как прочитает. Я немного про другое... Qt-сокеты кешируют отправляемые данные. Если же из-за каких-то проблем с сетью или низкой скорости работы принимающей стороны, реально данные по сети не уходят (буфер отправки tcp-стека переполнен), то они будут скапливаться в памяти. А сервер вместо того, что бы заниматься теми клиентами, которые готовы принимать данные, будет периодически загружать все новые куски для "тормозящего" клиента и складывать их в памяти. Хотя... Если bytesWritten отправляется только после реальной отправки данных, то все будет нормально. Полез смотреть. Да, вместо QSocketNotifier можно использовать сигнал bytesWritten(). Сообщение отредактировал BRE - 19.2.2010, 17:10 |
|
|
Текстовая версия | Сейчас: 3.12.2024, 23:30 |