Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > WSAEventSelect Model and event Notification |
Автор: knut 9.11.2007, 09:54 | ||||||||||||
день добрый. Делаю клиентский ТCP-шний сокет используя меxанизм евентов а точнее WSAEventSelect. есть 2 класса 1. сам класс CSocket
и соответственно реализация всеx метов.
и класс thread и сажаю все евенты.
с медодами старт и воркертред.
и сам воркер
так вот кажвый евент сажаю в поток. это все что я делаю.
так вот сейчас проблема. создаю сокет,конектаюс к серверу.и посылаю сообшения и жду рисива но не какого ресива не приxодит. не как не пойму в чем проблема та? |
Автор: ama_kid 9.11.2007, 10:41 |
выложи хоть минимально обрезанный компилируемый исходник, а то я забодался обтачивать напильником твои огрызки для получения воспроизводимости проблемы... В частности, непонятно что за переменные obsocket и opacket... Ну и по мелочи, в итоге набегает пара десятков ошибок... Так же не видно функции WSAStartup()... |
Автор: knut 9.11.2007, 11:21 | ||||
ama_kid, obsocket и opacket это обекты классов CSocket и структуры Paket. Так же не видно функции WSAStartup().. есть она точно и не в ней проблемма . так вот зделав классы сокет и тред.начинаем релизац.клиентакого сокета. 1.создаем сокет. 2.конектимся к серверу и ждем рисива но не какого рисива не получаем. вот 2 метода релиз. евентную модель.
и воркер евентов.
|
Автор: dumb 9.11.2007, 12:45 |
о. уже переделал... ![]() +1 |
Автор: xvr 9.11.2007, 14:57 | ||
|
Автор: knut 9.11.2007, 15:33 | ||
xvr, да этого ифа не доходит
ждет ждет но не чего не получает |
Автор: xvr 9.11.2007, 16:55 | ||||
Глупый вопрос - а сервер точно что-то отправляет? Может и получать нечего? |
Автор: knut 9.11.2007, 17:07 | ||
xvr,
да отправляет |
Автор: xvr 9.11.2007, 17:44 | ||||
Отправляет просто по факту подключения к нему? Я что то не заметил в исходных кодах, что бы твой клиент что-нибудь посылал серверу при подключении. Попробуй проверить сервер - подключись к нему например telnet'ом |
Автор: knut 10.11.2007, 15:16 | ||||
картина такая. создат сокет,конекнулся к серверу и послал пакет пока все нормально.
потом вызеваю StartThread(); создаю собтие,создаю новый тред и жду ивента на рисив в созданном потоке.
так вот пакет отправлен,поток создан все что надо это получить рисив тогда когда WSAWaitForMultipleEvents(...) сработает.. но он на WSAWaitForMultipleEvents(..) зависает и не какого ответного ивента на рисив не получает. p.s может я че то путаю с организацей? |
Автор: dumb 10.11.2007, 19:03 |
knut, как думаешь - легко в голове сложить все твои отрывки, попробовать догадаться, как ты реализовал то, что рассказываешь "в прозе", добавить недостающее и оценить правильность организации? - и кто будет заниматься подобной ....?! ![]() |
Автор: xvr 10.11.2007, 19:28 | ||||
Я что то не нашел в этом коде где ты послал пакет ? Вижу только конект и ожидание приема, передачу чего-либо не вижу. |
Автор: knut 10.11.2007, 20:43 | ||
dumb, согласен с ясностю поса у меня не так получилось ка xотелос.но я выкладываю всю реализацию выесняется не то. выкладываю куски опять не то. мил. человек в чем же дело? xvr,
если внимательно посмотреть на OnSend(paket); и пост номет 1 где реализ. метода OnSend то будет ясность в моем посте ![]() |
Автор: xvr 10.11.2007, 21:12 | ||||
Посмотрел, увидел отправку пакета в overlapped режиме, но не увидел ожидания окончания отправки (метод есть, но он не вызывается) Так же неясно, будут ли валидными буфера с содержимым для передачи и overlapped структура до окончания собственно передачи (а они ДОЛЖНЫ быть валидными). Попробуй для начала отправить пакет в не-overlapped режиме (подай NULL вместо указателя на overlapped структуру в WSASend в OnSend) Так же можно попробовать принять пакет в не-overlapped режиме. Если заработает - ищи ошибку в реализации overlapped режима, иначе - в приеме/передаче/подсоединении. |
Автор: knut 11.11.2007, 13:44 |
вот обрезанный пример где точно есть наличие проблемы. ормально кмпилится ![]() p.s буду признателен за помпшь |
Автор: xvr 12.11.2007, 19:04 | ||||||||
Да уж, наличие проблемы есть ![]()
![]() Далее, передача данных:
Про == вместо != я уже писал:
|
Автор: knut 12.11.2007, 22:24 |
xvr, спасибо тебе за замечание но вот исправленный вариант. но меня убивает то что я не могу понять почему у меня WSAEventSelect е зависает и не как не выxодет. ![]() я WSARecive(...) вызвал в main() е у меня рисив нормально прошел. а вот посадить его на ивент не как не получается. не пойму то я не так делаю в организации потоковай модели.? |
Автор: xvr 12.11.2007, 23:32 | ||||||
Убери строку
в конце цикла обработки event'ов в CSocketThread::ThreadProc. Этот event автоматически сбрасывается в WSAWaitForMultipleEvents и снова устанавливается в теле обработки, после чего ты его сбрасываешь вручную и в таком состоянии он остается навсегда :( Кстати, отправка данных по FD_WRITE тоже не будет работать - вот выдержка из описания WSAEventSelect
|
Автор: ama_kid 13.11.2007, 12:12 | ||||||||||||||||
knut, Эээ... как это так?!
Далее, почему-то везде используются расширения WSA... а тут:
Так же не совсем понятна идея использования массива евентов при вызове WSAEventSelect. В МСДН http://msdn2.microsoft.com/en-us/library/ms741576.aspx:
А зачем ты из процедуры потока ThreadProc напрямую обращаешься к объектам CSocket obsocket и tagPACKET opacket без синхронизации? В таком случае - ты никак не защищен от межпотоковых коллизий и порчи данных... Про утечки памяти при таком использовании потока я уж и не говорю (нет выхода из цикла потоковой функции)... Ну и самое интересное: при запуске потока ты инициализируешь на обработку евентов сокет m_hsocket объекта CSocket
Ну и по мелочи - куча недочетов типа: Функция CSocket::OpenSoket возвращает тип bool, а ты пишешь return m_hsocket типа SOCKET. Вообще, складывается такое ощущение, что ты просто натаскал из разных источников куски кода и пытался придать им работающий вид...
|