![]() |
|
![]() ![]() ![]() |
|
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 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
КАК? если сокет слушает в потоке, который можно убить только из потока. Dreamer_0x01, объясни мне как довать команды потоку, message_map или чтото такое. Заранее благодарен. -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Вообще, есть такая функция, как PostThreadMessage(). Но она больше подходит для интерфейсных потоков. Кроме того, она не синхронная (правда, в одном из топиков я делал ее синхронный аналог..) А самым простым решением будет завести некоторую структуру, доступную для нескольких потоков, но данные в ней должны читаться/зхаписываться только с использованием объектов синхронизации. То есть механизм приблизительно таков: 1. Рабочий поток может иметь несолько "состояний", которые характеризуются параметрами структуры. Каждый какой-то период времени поток заходит в объект синхронизации, считывает параметры из структуры,и выходит их объета синхронизации. 2. Главный поток , при совершении пользователем каких-то действий, заходит в объект синхронизации, переписывает параметры структуры надлежащим образом (которые при считывании рабочим потоком введут его в заданное состояние), и выходит из объекта синхронизации. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: 6 Всего: 8 |
А как нацывается этот
Должен же быть какой-то класс MFC для этого? -------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
самый простой объект синхронизации - это критическая секция. Правда, я не помню, как называется MFC-аналог критической секции CRITICAL_SECTION. (CCriticalSection по-моему)
А более сложные - на базе класса CSyncObject. (CEvent,CMutex,CSemaphore,CSingleLock,CMultiLock). Добавлено @ 14:25 А вообще, я развивал связанную с эим тему вот тут. http://forum.vingrad.ru/index.php?showtopic=80351&st=0 Начиная со второй страницы этой темы как раз есть несколько постов по этой тематике. Обрати внимания на ответы пользователя Earnest. Все, что нужно для взаимодействия потоков,она расписала по полочкам ;) -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |