Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по winsock, функция connect 
:(
    Опции темы
Sergio
Дата 3.2.2007, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



Здраствуйте. Сделал серверную и клиентскую часть по протоколу TCP. Использовал winsock.h И вот постала передо мной проблема. Как узнать что сервак отключился? Можно ли эту проблему решить без создания клиента на сервере? Может winsock2.h решает эти проблемы?


Это сообщение отредактировал(а) Sergio - 3.2.2007, 23:24
PM MAIL ICQ   Вверх
Dimonius
Дата 4.2.2007, 02:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 11.10.2006

Репутация: нет
Всего: 1



Используй функцию select() для работы с дескрипторами.
И, если recv() возвращает 0 (FIN), при этом не принимая никаких данных, значит сервер отключился.
В принципе, так у меня работало для Berkeley Sockets, но думаю, что и для winsock должно сработать.


Это сообщение отредактировал(а) Dimonius - 4.2.2007, 02:17
PM MAIL   Вверх
witex
Дата 4.2.2007, 02:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 1
Всего: 4



впринципе так и есть! потому что надо потоянный цикл  recv делать! вот и прикол в том что делаешь его пока он не равен 0 просто! если сервакотключился ! он из цикла выходит! вот и ставь любое действие после выхода из цикла! это действие будет значить что ты отключился от сервака! в любых исходникак протокола они есть!
--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
ptr
Дата 4.2.2007, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Цитата(Sergio @  4.2.2007,  02:15 Найти цитируемый пост)
Как узнать что сервак отключился?

Отключился или потеряна связь?

Цитата(Dimonius @  4.2.2007,  05:06 Найти цитируемый пост)
Используй функцию select() для работы с дескрипторами.

А select зачем?

Цитата(Dimonius @  4.2.2007,  05:06 Найти цитируемый пост)
И, если recv() возвращает 0 (FIN), при этом не принимая никаких данных, значит сервер отключился.

Ну и про send надо не забывать.

Это сообщение отредактировал(а) ptr - 4.2.2007, 08:52


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
vitaly1979
Дата 4.2.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.2.2006

Репутация: нет
Всего: 1



ptr, правильно заметил

при корректном закрытии удаленного конца  на своем сокете получаешь событие FD_CLOSE(WSAEnumNetworkEvents)
но это неблокирующие сокеты

если блокирующие, и если хочешь неглючную прогу, обязательно select!
recv блокирует прогу


PM MAIL   Вверх
Sergio
Дата 4.2.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: нет
Всего: 1



Я возможно неправильно выразился. Я хочу чтобы, когда из сервером потеряна чвязь клиент знал об этом и не продолжал посылать смс. Можно это сделать без клиентской части на серваку? 
PM MAIL ICQ   Вверх
witex
Дата 5.2.2007, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 16.10.2006
Где: Эстония

Репутация: 1
Всего: 4



тебе же говорят! у тебя тожлен хоть какой то цикл стояь на recv.
Код

while( (bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) &&
(bytes_recv !=SOCKET_ERROR))

--------------------
Я не волшебник, я только учусь."Шлёпни в Гугл" - Афтор Былов Ю.М. 
PM MAIL   Вверх
ptr
Дата 6.2.2007, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Sergio, подожди, давай по-порядку. Я так понял, что ты продолжаешь писать чат.

Цитата(Sergio @  4.2.2007,  17:47 Найти цитируемый пост)
Можно это сделать без клиентской части на серваку? 

Что ты подразумеваешь под этим?

Цитата(Sergio @  4.2.2007,  17:47 Найти цитируемый пост)
Я хочу чтобы, когда из сервером потеряна чвязь клиент знал об этом и не продолжал посылать смс.

Если всё правильно сделано, то в этом случае send вернёт какую-нибудь из ошибок (правда возможно не сразу). Так что надо правильно написать обработку и всё будет нормально.

Есть правда другая проблема - контроль связи. TCP не выполняет опрос соединения.
Для большинства программ не нужно немедленно знать о потери связи, для других же это может иметь значение. Для контроля соединения можно использовать таймер keep-alive (правда чаще всего он бесполезен). Но обычно функциональность keep-alive реализуют на прикладном уровне, либо используют тайм-аут.

По этому вопросу рекомендую почитать Снейдера со Стивенсом.

Это сообщение отредактировал(а) ptr - 6.2.2007, 06:30


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
vitaly1979
Дата 15.2.2007, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.2.2006

Репутация: нет
Всего: 1



ptr, например для сокета с опцией keep-alive какое событие вы будете ловить?
PM MAIL   Вверх
azesmcar
Дата 16.2.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 3
Всего: 211



Цитата

Используй функцию select() для работы с дескрипторами.
И, если recv() возвращает 0 (FIN), при этом не принимая никаких данных, значит сервер отключился.
В принципе, так у меня работало для Berkeley Sockets, но думаю, что и для winsock должно сработать.


Не все так просто (как хотелось бы) smile

0 возвращяется при нормальном завершении клиентского процесса. Если скажем процесс клиента убили то recv вернет SOCKET_ERROR а прочитав errno (под юникс) или просто GetLastError() (под виндоуз) станет ясно что его убили.
ошибка номер 10053 - клиента убили smile
и еще recv вам никогда не скажет что клиент погиб смертью храбрых в бою с электриком если вдруг последний решит вырубить свет..конкретнее если компьютер просто вырубится. На эти случае нужен  Keep-Alive.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.