![]() |
|
![]() ![]() ![]() |
|
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Я сделал всё как в хелпе написано сделел пару приложений:
- одно (сервер) вызывает функцию Listen() и "зависает" пока не подключится клиент. - другое (клиент) пытается соединица, все заработало. Ну я ка нормальны человек сделать так чтоб приложение не "зависало", я вызов Listen() запихнул в отдельный поток и тут всё началось эта функция перестаёт ждать и сразу выходит после чего припопытке подключения клиента выбивает на ASSERT ![]() Что делать, кто-то с такм сталкивался? -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 2 Всего: 23 |
Если я правильно помню, то listen переводит сокет в состояние ожидания соединений. Принимает подклбчения функция accept.
|
|||
|
||||
Kill_em_all |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 52 Регистрация: 2.4.2005 Репутация: нет Всего: нет |
попробуй ожидание сделать в отдельном потоке или
перевести сокет в асинхронный режим(не знаю как в CSocket это делается, а на WinApi могу показать) |
|||
|
||||
Athlon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 15.1.2006 Где: Украина:: Запорож ье Репутация: нет Всего: нет |
Извини за глупый вопрос, а зачем выносить Listen в отдельный поток, ведь если я не ошибаюсь CSocket наследуется от CAsyncSocket, т.е. Listen должен работать асинхорно и не тормозить сервер.
|
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Kill_em_all, так все проблемы и начинаются с переном вызова функции Listen в отдельный поток.
Athlon, я тоже так думаю, но функия не возвращет значения пока дочерний (подключающийся сокет) не попытается подлючится и тогда если вызвать Listen в каком-либо обработкике программа зависет. -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Олег2005 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: нет Всего: 11 |
Rapalex,
На сервере TCP имеется один слушающий сокет, который работает все время запуска программы-сервера. Для этого единственного сокета (в нашем случае) функция Listen только подготавливает очередь для приема заявок на подключение - она ничего не слушает!!! Поэтому исполнять ее в отдельном потоке - нонсенс. |
|||
|
||||
DemonDima |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 23.3.2006 Репутация: нет Всего: нет |
на самом деле можно и в потоке вызывать listen, но после неё необходимо вызывать и accept... да еще в самом начале перед listen необходимо в потоке вызвать AfxSocketInit() и всё работает...
|
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Да так и есть спаибо, только поток должен быть Интерыейсным, а сними у меня проблеммы были, я даже новую тему открыл.
-------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
У меня вопрос: А можно сделать так чтобы Listen() не до бесконечности ждала, 30 сек чтото вроде timout?
-------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Так а смысл какой? Эта функция поток не усыпляет ведь, просто устанавливает сокет в режим прослушки. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Как так поток не усыплён но на сообщения не будет реагировать, я так думаю, кстати какой вункцией потоку сообщения посылать. -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Не понял суть вопроса.
Вернемся к началу. Для классов, базирующихся на CAsyncSocket. Берем серверный сокет, запускаем его на прослушку, вызвав Listen(). Далее поток занимается какими-то своими делами, пока не подключится клиентский сокет (На клиентской стороне соответственно должна быть вызвана функция Connect() ). Клиентсий сокет вызовет событие сокета OnAccept(), которое и нужно будет обработать.В обработчике вызвать функцию Accept(). На клиентской стороне эта функция породит сообщение OnConnect(). Ну и собственно усе, соединение установлено... Добавлено @ 17:13 Короче, если что, могу дать свой пример, на котором я как раз не так давно сам осваивал работу сокетов. Правда, я из асинхронных сделал их синхронными, было необходимо ... Одно приложение серверное, другое клиентское. Пиши в личку с указанием мыла - могу скинуть, покопаешься и разберешься ;) -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
Спасибо, но ты сам знаеш что в чюжой проге разбираться - проще самому написать.
Да. Всё так и есть, так и сделано. Только алгоритм работы проги такой: 1 - подключается определённое количество клиентов к серверу (пока я не нажму кнопку). 2 - я нажимаю кнопку и перестаём подключать других и начинаем обменеваться данными с уже подключёнными. 3 - обменялись и закрылась прога. Проблемма: Я нажимаю кнопку, а функция Listen() (в дркгом интерфейсном потоке) ждёт, и поток не хочет умирать!!! -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Олег2005 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: нет Всего: 11 |
Rapalex,
Алгоритм конечно интересный ![]() Но если вы больше не хотите слушать сеть и принимать запросы, то вы по нажатию кнопки просто должны убить слушающий сокет. И все - сервер больше не будет принимать ничего. Обслужили всех и опять создаете слушающий сокет |
||||
|
|||||
Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Когда к серверу "стучиться" клиент, вы ему отвечаете "Accept".
Когда же у вас набралось достаточное количество соединений, просто не отвечайте ничего клиентам, соединеине устанавливаться не будет. Это сообщение отредактировал(а) Dreamer_0x01 - 4.4.2006, 00:02 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |