![]() |
|
|
![]()
|
|
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Парралельно? Какие проблемы! просто в функции OnRecieve() управляй потоком для ком-портов Или я не правильно понял? Ты не прогу распиши, а проблему. Именно конкретно проблему! -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Dreamer_0x01 |
|
||||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
поблема в том, что мне нужно сделать именно ОЖИДАНИЕ.
Рассмотрим на примере коннекта (его я тоже сделал по ожиданию) Вот класс, производного от CAsyncSocket:
Вот что порисходит по вызову функции OnConnect.
А вот собственно функия, которую я хочу вызывать вне класса (по аналогичному принципу я собираюсь вызывать и функцию Read, использующую флаг Ready, выставляемый в функции OnReceive, но этопотом..)
Я в функции OnConnect поставил бреакпоинт. И при запуске фуекции MakeConnect(...) просто проходит цикл опроса, пока не исчерпается таймаут, и все...На брекпоинт мы не попадаем, хотя соединение должно установиться. (Во всяком случае серверная часть написанная по-простому, OnAccept выдает). Вот я и не понимаю, кто должен вызвать функцию OnConnect ? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||||
|
|||||||
| Coocky |
|
||||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Ты конектишься и хочешь работать только в том случае, если коннект удачный?
Но ответ от функции коннет занимает некоторое время, которое ты должен подождать, что б узнать результат соединения? Я правильно понял? Добавлено @ 19:15
Покажи мне код, где ты создаешь гнездо,и прослушиваешь запрос на соединение? Ты делаешь Listen() ?
Все виртуальные функции OnConnect(),OnAccept(),OnRecieve() должны быть перегружены в твоем классе,производном от CAsyncSocket, что у тебя и иметтся. Они вызываются когда СИСТЕМА генерирует события о прослушивании,приеме, закрытии и т.д. Как это происходит внутри МФС, и незнаю, да и ненадо это знать -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
||||
|
|||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
И вообще, покажи ,как ты создаешь гнезда в клинтской и серверной части.
Надеюсь у тебя их две -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Dreamer_0x01 |
|
||||||||||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Именно. И то же самое для приема данных - нужно обязательно дождаться.
В смысле, Listen в серверной части? Обязательно! Но здась у меня именно клиентская, и я делаю именно Connetc. Она работоспособная, за это ручаюсь, так как в старой версией, где все сокеты были засунуты в оконные классы и им слались сообщения, все соединялось, передавалось как надо. И серверную часть я сейчас не трогаю, она в отдельном приложении. Но если такие уж сомнения, вот серверная часть, но она работает, проверялось не раз:
Вот создание прослушки:
И собственно вот:
Так что с серверной частью порядок, прослушку она делает, Ассепт по коннекту тоже... Вот в клиентской части, как видишь, возникли проблемы с ожиданием... -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||||||||||
|
|||||||||||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
А с обработкой сообщений всё Ок? WM_SOCKET_NOTIFY идут? Для теста удобно использовать сканер, например, XSpider - можно проверить (на localhost) клиента и сервер.
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Это что такое? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Блин, так какую проблему рещать-проблему с синхронизацией ожидания и приема или проблему с неполучением сообщений? -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Желательно, обе. Так как решив торую, первая тоже решится сама собой.
Ну либо принципиально другое красивое решение первой проблемы... Добавлено @ 15:54 Хорошо, я переформирую заново вопрос таким образом. Мне нужно иметь три функции: 1. Функция "Соединиться" - она должна послать запрос на соединение и дождаться результата. 2. Функция "Послать буфер данных". 3. Функция "Принять буфер данных" - должна иметь какой-то таймаут, в течение которого должна дождаться получения нужного количества байт из сокета. Как, сколько классов надо будет завернуть в это дело, сколько потоков наплодить - в общем-то без разницы, главное, чтобы работало. -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Смотри реализацию CAsyncSocket в sockcore.cpp OnReceive и т.п. OnXXX вызываются из обработчика WM_SOCKET_NOTIFY CSocketWnd::OnSocketNotify() -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
да, но при чем тут СSocketWnd ?
Ведь CAsyncSocket унаследован от CObject...., а CSocketWnd лишь объявлен для него как "друг"... (смотрю файл afxsock.h) -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Смотри CAsyncSocket::AttachHandle() и выше. Видать $M решили извещения посылать через обычную очередь сообщений (для этого и СSocketWnd), если будешь ее "тормозить", то тогда и не дождёшься OnReceive и т.п.. -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
блин, так что, в каждом сокете еще и оконный класс получается создается?
Во изващение... -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Окно ведь invisible! Мне оно не мешает. А как Windows XP переводится? Окошки XP?! Да? Чтобы поток был GUI он должен иметь окно (точнее очередь сообщений и т.п.), первичный поток всегда GUI-поток. Ну вот, MFC сделали по принципу "всё гениальное просто" и не стали придумывать колесо - сделали извещения через СSocketWnd -------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
Да, но оконный класс я так понял, хоть и имеет свою очредь сообщений, но эта очередь сообщений должна "прокручиваться" каким-то интерфейсным потоком. Который я так понимаю является тем потоком, в котором я создаю сокет и объявляю AfxSocketInit, так?
Тогда мне наверное следует создать свой интерфейсный поток именно для этих целей, чтобы в ожидании не "усыплять" поток, который должен будет "прокручива" эту очередь сообщений. Правильно? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |