обсуждался вопрос, используют ли функции WSASend/WSARecv входные параметры _после_ прихода завершения на GetQueuedCompletionStatus, но _до_ выхода из этих функций.
Я, с некоторыми другими товарищами, активно настаивал что нет, не используют. Подразумевая, конечно, структуру OVERLAPPED, как основной объект.. хм.. динамизма И это так, её не используют.
Но есть другая проблема — структура WSABUF. Её таки держат:
If this function is completed in an overlapped manner, it is the Winsock service provider's responsibility to capture the WSABUF structures before returning from this call. This enables applications to build stack-based WSABUF arrays pointed to by the lpBuffers parameter. http://msdn.microsoft.com/en-us/library/ms742203(VS.85).aspx
Т.е. эти структуры надо создавать на стеке. Я всегда делал только так, и поэтому с проблемами нарушения доступа не сталкивался.
А вот кое-кто пихает куда не следует
Здравствуйте, Gomes, Вы писали:
G>Но есть другая проблема — структура WSABUF. Её таки держат: G>Т.е. эти структуры надо создавать на стеке. Я всегда делал только так, и поэтому с проблемами нарушения доступа не сталкивался. G>А вот кое-кто пихает куда не следует
хм, мне почему-то в приведенном абзаце из MSDN больше бросилось в глаза второе предложение:
If this function is completed in an overlapped manner, it is the Winsock service provider's responsibility to capture the WSABUF structures before returning from this call. This enables applications to build stack-based WSABUF arrays pointed to by the lpBuffers parameter. http://msdn.microsoft.com/en-us/library/ms742203(VS.85).aspx
то есть, приложения могут, а не обязаны создавать структуры на стеке.
G>обсуждался вопрос, используют ли функции WSASend/WSARecv входные параметры _после_ прихода завершения на GetQueuedCompletionStatus, но _до_ выхода из этих функций. G>Я, с некоторыми другими товарищами, активно настаивал что нет, не используют. Подразумевая, конечно, структуру OVERLAPPED, как основной объект.. хм.. динамизма И это так, её не используют.
* Asio:
...
o Fixed a problem with the lifetime of handler memory, where Windows needs the OVERLAPPED structure to be valid until both the initiating function call has returned and the completion packet has been delivered.
...
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Вообще интересно, что разработчики boost::asio имели в виду под приведенной в указанной теме фразой (http://www.boost.org/users/news/version_1_42_0): MC>Речь идет именно про OVERLAPPED, а не про WSABUF.
Качну, попробую разобраться. Хотя думаю там дебри ещё те
Здравствуйте, Pepel, Вы писали:
P>я WSABUF размещаю в куче и тащу адрес через поле OVERLAPPED на завершение — где и освобождаю/переразмещаю , за 9 месяце ни одного слета
G>>> // Check if the operation completed immediately.
G>>> if (result != 0 && last_error != WSA_IO_PENDING)
G>>>
MC>>Все правильно, в первом случае уведомления не поступит, во втором поступит.
G>Так, не понял. Это ж просто обработка ошибки, причем тут "operation completed immediately"?
Притом что уведомления не будет, операция сразу завершилась с ошибкой.
Здравствуйте, Gomes, Вы писали:
MC>>Притом что уведомления не будет, операция сразу завершилась с ошибкой.
G>Так ведь это ошибка, это не "operation completed immediately". Данные не ушли.
Ушли ли данные — это вопрос другой. Операция закончилась, ничего уже с ней связанного не будет.
Здравствуйте, Pepel, Вы писали:
P>я WSABUF размещаю в куче и тащу адрес через поле OVERLAPPED на завершение — где и освобождаю/переразмещаю , за 9 месяце ни одного слета
Ваши 9 месяцев не отменяют утверждения в MSDN по поводу необходимости держать WSABUF до выхода из WSASend (именно до выхода из WSASend, а не до завершения операции).
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Ушли ли данные — это вопрос другой. Операция закончилась, ничего уже с ней связанного не будет.
Мы как на разных языках щаз ;)
Это:
if (result != 0 && last_error != WSA_IO_PENDING)
проверка на ОШИБКУ!
Никаким "operation completed immediately" здесь не пахнет!
При "completed immediately":
1. result == 0;
2. как мы знаем завершенка приходит, и ничего дополнительно проверять не надо.
Здравствуйте, Gomes, Вы писали:
G>Это: G>if (result != 0 && last_error != WSA_IO_PENDING) G>проверка на ОШИБКУ! G>Никаким "operation completed immediately" здесь не пахнет!
А что, разве операция не завершилась? Причем ведь сразу, immediately
Тот факт, что произошла ошибка, никак не отменяет факт немедленного завершения операции.
G>При "completed immediately": G>1. result == 0;
Это частный случай. Completed immediately and successfully
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Тот факт, что произошла ошибка, никак не отменяет факт немедленного завершения операции. MC>Это частный случай. Completed immediately and successfully :)
Ты, видимо, в контексте темы пишешь. А я вообще. Криво же написано.
Здравствуйте, Gomes, Вы писали:
G>Или это такое глобальное обобщение — нет pending-а, значит immediately? G>Т.е. предлагают ошибку обрабатывать в рабочем потоке.
А где ее еще обрабатывать, если уведомления не будет?
Все правильно у них написано.