Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемма с функцией Listen() в классе CSocket, Может я чегото не знаю? 
:(
    Опции темы
Rapalex
Дата 18.3.2006, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 8



Я сделал всё как в хелпе написано сделел пару приложений:

- одно (сервер) вызывает функцию Listen() и "зависает" пока не подключится клиент.
- другое (клиент) пытается соединица, все заработало.

Ну я ка нормальны человек сделать так чтоб приложение не "зависало", я вызов Listen() запихнул в отдельный поток и тут всё началось эта функция перестаёт ждать и сразу выходит после чего припопытке подключения клиента выбивает на ASSERT smile

Что делать, кто-то с такм сталкивался?



--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
NiJazz
Дата 18.3.2006, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 2
Всего: 23



Если я правильно помню, то listen переводит сокет в состояние ожидания соединений. Принимает подклбчения функция accept.
PM MAIL   Вверх
Kill_em_all
Дата 18.3.2006, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



попробуй ожидание сделать в отдельном потоке или
перевести сокет в асинхронный режим(не знаю как
в CSocket это делается, а на WinApi могу показать)
PM MAIL   Вверх
Athlon
Дата 18.3.2006, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Извини за глупый вопрос, а зачем выносить Listen в отдельный поток, ведь если я не ошибаюсь CSocket наследуется от CAsyncSocket, т.е. Listen должен работать асинхорно и не тормозить сервер.
PM MAIL ICQ   Вверх
Rapalex
Дата 19.3.2006, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 8



Kill_em_all, так все проблемы и начинаются с переном вызова функции Listen в отдельный поток.

Athlon, я тоже так думаю, но функия не возвращет значения пока дочерний (подключающийся сокет) не попытается подлючится и тогда если вызвать Listen в каком-либо обработкике программа зависет.


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Олег2005
Дата 19.3.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



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

PM MAIL WWW MSN   Вверх
DemonDima
Дата 24.3.2006, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



на самом деле можно и в потоке вызывать listen, но после неё необходимо вызывать и accept... да еще в самом начале перед listen необходимо в потоке вызвать AfxSocketInit() и всё работает...
PM MAIL ICQ   Вверх
Rapalex
Дата 1.4.2006, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 8



Да так и есть спаибо, только поток должен быть Интерыейсным, а сними у меня проблеммы были, я даже новую тему открыл.


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Rapalex
Дата 3.4.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 8



У меня вопрос: А можно сделать так чтобы Listen() не до бесконечности ждала, 30 сек чтото вроде timout?


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Dreamer_0x01
Дата 3.4.2006, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Цитата(Rapalex @ 3.4.2006, 13:39 Найти цитируемый пост)
А можно сделать так чтобы Listen() не до бесконечности ждала, 30 сек чтото вроде timout?


Так а смысл какой? Эта функция поток не усыпляет ведь, просто устанавливает сокет в режим прослушки.


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Rapalex
Дата 3.4.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 8



Цитата

не усыпляет


Как так поток не усыплён но на сообщения не будет реагировать, я так думаю, кстати какой вункцией потоку сообщения посылать.


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Dreamer_0x01
Дата 3.4.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Не понял суть вопроса.

Вернемся к началу.
Для классов, базирующихся на CAsyncSocket.
Берем серверный сокет, запускаем его на прослушку, вызвав Listen().
Далее поток занимается какими-то своими делами, пока не подключится клиентский сокет (На клиентской стороне соответственно должна быть вызвана функция Connect() ).
Клиентсий сокет вызовет событие сокета OnAccept(), которое и нужно будет обработать.В обработчике вызвать функцию Accept(). На клиентской стороне эта функция породит сообщение OnConnect(). Ну и собственно усе, соединение установлено...
Добавлено @ 17:13
Короче, если что, могу дать свой пример, на котором я как раз не так давно сам осваивал работу сокетов. Правда, я из асинхронных сделал их синхронными, было необходимо ...
Одно приложение серверное, другое клиентское.

Пиши в личку с указанием мыла - могу скинуть, покопаешься и разберешься ;)


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Rapalex
Дата 3.4.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 8



Спасибо, но ты сам знаеш что в чюжой проге разбираться - проще самому написать.

Цитата

Берем серверный сокет, запускаем его на прослушку, вызвав Listen().
Далее поток занимается какими-то своими делами, пока не подключится клиентский сокет (На клиентской стороне соответственно должна быть вызвана функция Connect() ).
Клиентсий сокет вызовет событие сокета OnAccept(), которое и нужно будет обработать.В обработчике вызвать функцию Accept(). На клиентской стороне эта функция породит сообщение OnConnect(). Ну и собственно усе, соединение установлено...


Да. Всё так и есть, так и сделано.

Только алгоритм работы проги такой:
1 - подключается определённое количество клиентов к серверу (пока я не нажму кнопку).
2 - я нажимаю кнопку и перестаём подключать других и начинаем обменеваться данными с уже подключёнными.
3 - обменялись и закрылась прога.

Проблемма: Я нажимаю кнопку, а функция Listen() (в дркгом интерфейсном потоке) ждёт, и поток не хочет умирать!!!


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Олег2005
Дата 3.4.2006, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

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



Rapalex,
Цитата

Поэтому исполнять ее в отдельном потоке - нонсенс.


Цитата

Проблемма: Я нажимаю кнопку, а функция Listen() (в дркгом интерфейсном потоке) ждёт, и поток не хочет умирать!!

Алгоритм конечно интересный smile
Но
если вы больше не хотите слушать сеть и принимать запросы, то вы по нажатию кнопки просто должны убить слушающий сокет.
И все - сервер больше не будет принимать ничего.
Обслужили всех и опять создаете слушающий сокет
PM MAIL WWW MSN   Вверх
Dreamer_0x01
Дата 4.4.2006, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Когда к серверу "стучиться" клиент, вы ему отвечаете "Accept".
Когда же у вас набралось достаточное количество соединений, просто не отвечайте ничего клиентам, соединеине устанавливаться не будет.

Это сообщение отредактировал(а) Dreamer_0x01 - 4.4.2006, 00:02


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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