Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Ассинхронная работа socket'ов WinSock2 |
Автор: VID 5.7.2006, 08:37 | ||
Привет! Появилась проблема с чтением данных с сокета, в режиме SOCK_DGRAM (без соединения) через функцию WSARecvFrom. Я читаю с указанием адреса процедуры завершения, которая должна будет вызваться системой при окончании приема датаграммы, но не вызывается ![]() Может кто сталкивался с подобной проблемой. MSDN примеров на эту тему не дает, инет тоже не кишит подобной информацией. Ниже привожу код, что и как вызывается. Прога - консольное приложение, далее планируется всю начинку запихнуть в dll
Далее в другом месте посылаем сообщение в порт 68. В блокирующем режиме я его получаю, а в неблокирующем функция обратного вызова CompletionRoutine не вызывается ![]() |
Автор: maxim1000 5.7.2006, 09:11 |
а где происходит ожидание прочтения? а то он только начал читать, а программа переходит на closesocket, WSACleanup и вообще завершает процесс... |
Автор: VID 5.7.2006, 09:43 | ||
Мда, тут я урезал программку, поэтому некрасиво получилось, грубо говоря там бесконечный цикл перед закрытием сокета, то есть примерно так:
Примерно так это выглядит, на деле сложнее, но суть не меняется я просто ожидаю. Делал и в отдельном потоке прослушивание совета и т.д и т.п, но результат один. |
Автор: maxim1000 5.7.2006, 12:22 |
на самом деле всё именно зависит от того, как ждать если бы Windows прерывала поток в любом месте и выполняла бы CompletionRoutine, наверняка, рано или поздно бы произошёл сбой - никакой ведь синхронизации поэтому делается по-другому: процедура окончания вызывается только, если поток находится в прерываемом состоянии для этого можно использовать, например, функцию SleepEx |
Автор: VID 5.7.2006, 12:59 |
maxim1000 спасибо, на самом деле так и оказалось. Я и думать забыл про синхронизацию ![]() Спасибо. |