![]() |
|
Модераторы: feodorv |
![]()
|
|
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
Здраствуйте. Сделал серверную и клиентскую часть по протоколу TCP. Использовал winsock.h И вот постала передо мной проблема. Как узнать что сервак отключился? Можно ли эту проблему решить без создания клиента на сервере? Может winsock2.h решает эти проблемы?
Это сообщение отредактировал(а) Sergio - 3.2.2007, 23:24 |
|||
|
||||
| Dimonius |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 11.10.2006 Репутация: нет Всего: 1 |
Используй функцию select() для работы с дескрипторами.
И, если recv() возвращает 0 (FIN), при этом не принимая никаких данных, значит сервер отключился. В принципе, так у меня работало для Berkeley Sockets, но думаю, что и для winsock должно сработать. Это сообщение отредактировал(а) Dimonius - 4.2.2007, 02:17 |
|||
|
||||
| witex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 16.10.2006 Где: Эстония Репутация: 1 Всего: 4 |
впринципе так и есть! потому что надо потоянный цикл recv делать! вот и прикол в том что делаешь его пока он не равен 0 просто! если сервакотключился ! он из цикла выходит! вот и ставь любое действие после выхода из цикла! это действие будет значить что ты отключился от сервака! в любых исходникак протокола они есть!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. |
|||
|
||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Отключился или потеряна связь? А select зачем?
Ну и про send надо не забывать. Это сообщение отредактировал(а) ptr - 4.2.2007, 08:52 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| vitaly1979 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 26.2.2006 Репутация: нет Всего: 1 |
ptr, правильно заметил
при корректном закрытии удаленного конца на своем сокете получаешь событие FD_CLOSE(WSAEnumNetworkEvents) но это неблокирующие сокеты если блокирующие, и если хочешь неглючную прогу, обязательно select! recv блокирует прогу |
|||
|
||||
| Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: нет Всего: 1 |
Я возможно неправильно выразился. Я хочу чтобы, когда из сервером потеряна чвязь клиент знал об этом и не продолжал посылать смс. Можно это сделать без клиентской части на серваку?
|
|||
|
||||
| witex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 224 Регистрация: 16.10.2006 Где: Эстония Репутация: 1 Всего: 4 |
тебе же говорят! у тебя тожлен хоть какой то цикл стояь на recv.
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. |
|||
|
||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 9 Всего: 14 |
Sergio, подожди, давай по-порядку. Я так понял, что ты продолжаешь писать чат.
Что ты подразумеваешь под этим?
Если всё правильно сделано, то в этом случае send вернёт какую-нибудь из ошибок (правда возможно не сразу). Так что надо правильно написать обработку и всё будет нормально. Есть правда другая проблема - контроль связи. TCP не выполняет опрос соединения. Для большинства программ не нужно немедленно знать о потери связи, для других же это может иметь значение. Для контроля соединения можно использовать таймер keep-alive (правда чаще всего он бесполезен). Но обычно функциональность keep-alive реализуют на прикладном уровне, либо используют тайм-аут. По этому вопросу рекомендую почитать Снейдера со Стивенсом. Это сообщение отредактировал(а) ptr - 6.2.2007, 06:30 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| vitaly1979 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 57 Регистрация: 26.2.2006 Репутация: нет Всего: 1 |
ptr, например для сокета с опцией keep-alive какое событие вы будете ловить?
|
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 3 Всего: 211 |
Не все так просто (как хотелось бы) 0 возвращяется при нормальном завершении клиентского процесса. Если скажем процесс клиента убили то recv вернет SOCKET_ERROR а прочитав errno (под юникс) или просто GetLastError() (под виндоуз) станет ясно что его убили. ошибка номер 10053 - клиента убили и еще recv вам никогда не скажет что клиент погиб смертью храбрых в бою с электриком если вдруг последний решит вырубить свет..конкретнее если компьютер просто вырубится. На эти случае нужен Keep-Alive. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |