Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
butcher
Зарегистрирован: 18.04.2003 Сообщения: 467 Откуда: Киров
|
Добавлено: Сб Янв 26 2002 02:04 Заголовок сообщения: WSAAsyncSelect, что это - глюки или нет? |
|
|
С++ Builder 5 создаю сокет ориентированный на приём датаграмм по протоколу UDP функции: socket(),bind() WSAAsyncSelect(MySocket,HWND,WSA_EVNTREAD,FD_READ); .. реакцию на готовность данных к чтению. Вначале всё замечательно работает, но потом вдруг перестаёт (думаю перестаёт приходить Message для окна HWND), что это может быть такое? Данные считываю функцией recvfrom(MySocket,buf,buf_len,0,(sockaddr*)&from_addr,&from_len); П.. пожалуйста, кто знает как правильно работать с этими функциями, если можно вышлите пример, буду благодарен. P.S. Не нужно предлагать пользоваться стандартными компонентами, я знаю что они замечательно работают, но моя задача требует использование функций Windows Socket 2. _________________ Нет ничего невозможного... |
|
Вернуться к началу |
|
|
appower Гость
|
Добавлено: Сб Янв 26 2002 04:27 Заголовок сообщения: Re: WSAAsyncSelect, что это - глюки или нет? |
|
|
Уточни как перестает работать? Какой сокет, блокирующий или нет и пр.
Вызови WSAGetLastError и переведи код, а там посмотрим.
P.S. И вообще перед каждым вызовом пиши WSASetLastError(0),а после WSAGetLastError(). Лишь так можно найти ошибку. |
|
Вернуться к началу |
|
|
butcher
Зарегистрирован: 18.04.2003 Сообщения: 467 Откуда: Киров
|
Добавлено: Сб Янв 26 2002 19:19 Заголовок сообщения: В том-то и дело, что никаких ошибок не возникает |
|
|
Вобщем, я пишу чат. Протокол UDP. Определяю WSA_EVNTREAD (WM_USER+666) В FormCreate назначаю Application-OnMessage = OnWSAReadNetEvent; В этой функции проверяю Msg.message==WSA_EVNTREAD если да то считываю данные функцией recvfrom() Таким образом после вызова WSAAsyncSelect моему приложению начинает приходить сообшение WM_USER+666, я его обрабатываю. Но через некоторое время обработка прекращается, просто перестаёт вызываться обработчик... Что это может быть? _________________ Нет ничего невозможного... |
|
Вернуться к началу |
|
|
butcher
Зарегистрирован: 18.04.2003 Сообщения: 467 Откуда: Киров
|
Добавлено: Сб Янв 26 2002 20:05 Заголовок сообщения: Re: В том-то и дело, что никаких ошибок не возникает |
|
|
Дополнительная проверка показала, что функция recvfrom вызывает ошибку №10035 WSAEWOULDBLOCK Теперь другой вопрос, как сделать чтобы её не было? _________________ Нет ничего невозможного... |
|
Вернуться к началу |
|
|
appower Гость
|
Добавлено: Сб Янв 26 2002 23:58 Заголовок сообщения: Re: В том-то и дело, что никаких ошибок не возникает |
|
|
Насколько я понял сокет всетаки неблокирующий. Ты пытаешся прочитать данные которые пришли неполностью или в настоящее время происходит их прием. И по вполне понятным причинам ядро говорит тебе, что данные не пришли(операция на неблокирующем сокете не может завершиться немедленно). Реализовать чтение можно так: 1) Выдержать время тайм-аута и попробовать позднее; 2) Выдели отдельную нить и прочитай на блокирующем сокете. |
|
Вернуться к началу |
|
|
butcher
Зарегистрирован: 18.04.2003 Сообщения: 467 Откуда: Киров
|
Добавлено: Вс Янв 27 2002 00:58 Заголовок сообщения: а где можно об этом почитать поподробнее? |
|
|
Просто я пользовался хелпом, там по английски . Как я понял сообщение WSA_EVNTREAD должно поступать к моей прграмме только тогда, когда данные готовы к чтению. А где можно об этом почитать поподробнееи желательно по-русски?
заранее благодарен _________________ Нет ничего невозможного... |
|
Вернуться к началу |
|
|
appower Гость
|
Добавлено: Вс Янв 27 2002 01:39 Заголовок сообщения: Re: а где можно об этом почитать поподробнее? |
|
|
Событие - ядро получило данные, приходит уже тогда, когда пришел первый байт, а дейтаграммы читаються полностью, поэтому тебе придется подождать. Вызови sleep(), но это грубо, гораздо элегантнее создать отдельную нить.
Почитать об этом можно в хорошей(не любой) книге по TCP/IP, к сожалению у меня эти книги в бумажном виде.
Еще довольно подробно это описано в MSDN, но только на английском. |
|
Вернуться к началу |
|
|
|