IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 08:47
Оценка: 1 (1)
В темах:
http://rsdn.ru/forum/network/3697233.aspx
Автор: MazkoK
Дата: 08.02.10

http://rsdn.ru/forum/network/3441036.aspx
Автор: Armastab
Дата: 24.06.09

обсуждался вопрос, используют ли функции 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

Т.е. эти структуры надо создавать на стеке. Я всегда делал только так, и поэтому с проблемами нарушения доступа не сталкивался.
А вот кое-кто пихает куда не следует

Вывод: Читаем мануалы — они рулез.

З.Ы. В свете этого, хотелось бы глянуть код asio 1.4.4 из boost 1.4
Автор: awson
Дата: 09.02.10
Re: IOCP и WSABUF
От: MazkoK  
Дата: 11.02.10 10:27
Оценка:
Здравствуйте, 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

то есть, приложения могут, а не обязаны создавать структуры на стеке.

Но факт в том, что это действительно помогло.
Re[2]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 10:31
Оценка:
Здравствуйте, MazkoK, Вы писали:

MK>то есть, приложения могут, а не обязаны создавать структуры на стеке.


Ну я и не сказал что обязаны Просто надо. Где-то в другом месте смысла нет, одни минусы.
Re: IOCP и WSABUF
От: Michael Chelnokov Украина  
Дата: 11.02.10 12:17
Оценка:
Здравствуйте, Gomes, Вы писали:

G>В темах:

G>http://rsdn.ru/forum/network/3697233.aspx
Автор: MazkoK
Дата: 08.02.10

G>http://rsdn.ru/forum/network/3441036.aspx
Автор: Armastab
Дата: 24.06.09

G>обсуждался вопрос, используют ли функции WSASend/WSARecv входные параметры _после_ прихода завершения на GetQueuedCompletionStatus, но _до_ выхода из этих функций.
G>Я, с некоторыми другими товарищами, активно настаивал что нет, не используют. Подразумевая, конечно, структуру OVERLAPPED, как основной объект.. хм.. динамизма И это так, её не используют.

Вообще интересно, что разработчики boost::asio имели в виду под приведенной в указанной теме фразой (http://www.boost.org/users/news/version_1_42_0):

* 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.
...


Речь идет именно про OVERLAPPED, а не про WSABUF.
Re[2]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 12:24
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Вообще интересно, что разработчики boost::asio имели в виду под приведенной в указанной теме фразой (http://www.boost.org/users/news/version_1_42_0):

MC>Речь идет именно про OVERLAPPED, а не про WSABUF.

Качну, попробую разобраться. Хотя думаю там дебри ещё те
Re[3]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 14:09
Оценка:
WSABUF там, конечно, на стеке. Дальнейшую обработку надо откапывать.
А вот то, что сделана разная обработка для разного завершения, уже настораживает:
    int result = ::WSASend(...

    // Check if the operation completed immediately.
    if (result != 0 && last_error != WSA_IO_PENDING)
    {
      ptr.get()->on_immediate_completion(last_error, bytes_transferred);
      ptr.release();
    }
    else
    {
      ptr.get()->on_pending();
      ptr.release();
    }
Re[4]: IOCP и WSABUF
От: Michael Chelnokov Украина  
Дата: 11.02.10 14:48
Оценка:
Здравствуйте, Gomes, Вы писали:

G>А вот то, что сделана разная обработка для разного завершения, уже настораживает:

G>
G>    int result = ::WSASend(...

G>    // Check if the operation completed immediately.
G>    if (result != 0 && last_error != WSA_IO_PENDING)
G>    {
G>      ptr.get()->on_immediate_completion(last_error, bytes_transferred);
G>      ptr.release();
G>    }
G>    else
G>    {
G>      ptr.get()->on_pending();
G>      ptr.release();
G>    }
G>


Все правильно, в первом случае уведомления не поступит, во втором поступит.
Re: IOCP и WSABUF
От: Pepel Беларусь  
Дата: 11.02.10 14:51
Оценка:
Здравствуйте, Gomes, Вы писали:

я WSABUF размещаю в куче и тащу адрес через поле OVERLAPPED на завершение — где и освобождаю/переразмещаю , за 9 месяце ни одного слета

тащить на завершение ВСЕ !!
Re[5]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 15:04
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

G>>А вот то, что сделана разная обработка для разного завершения, уже настораживает:

G>>
G>>    // Check if the operation completed immediately.
G>>    if (result != 0 && last_error != WSA_IO_PENDING)
G>>

MC>Все правильно, в первом случае уведомления не поступит, во втором поступит.

Так, не понял. Это ж просто обработка ошибки, причем тут "operation completed immediately"?
Re[2]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 15:06
Оценка:
Здравствуйте, Pepel, Вы писали:

P>я WSABUF размещаю в куче и тащу адрес через поле OVERLAPPED на завершение — где и освобождаю/переразмещаю , за 9 месяце ни одного слета


Удачи!

P>тащить на завершение ВСЕ !!


Да!!!
Re[6]: IOCP и WSABUF
От: Michael Chelnokov Украина  
Дата: 11.02.10 15:50
Оценка:
Здравствуйте, Gomes, Вы писали:

G>>>
G>>>    // Check if the operation completed immediately.
G>>>    if (result != 0 && last_error != WSA_IO_PENDING)
G>>>

MC>>Все правильно, в первом случае уведомления не поступит, во втором поступит.

G>Так, не понял. Это ж просто обработка ошибки, причем тут "operation completed immediately"?


Притом что уведомления не будет, операция сразу завершилась с ошибкой.
Re[7]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 15:57
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Притом что уведомления не будет, операция сразу завершилась с ошибкой.


Так ведь это ошибка, это не "operation completed immediately". Данные не ушли.
Re[8]: IOCP и WSABUF
От: Michael Chelnokov Украина  
Дата: 11.02.10 17:28
Оценка:
Здравствуйте, Gomes, Вы писали:

MC>>Притом что уведомления не будет, операция сразу завершилась с ошибкой.


G>Так ведь это ошибка, это не "operation completed immediately". Данные не ушли.


Ушли ли данные — это вопрос другой. Операция закончилась, ничего уже с ней связанного не будет.
Re[2]: IOCP и WSABUF
От: Michael Chelnokov Украина  
Дата: 11.02.10 17:32
Оценка:
Здравствуйте, Pepel, Вы писали:

P>я WSABUF размещаю в куче и тащу адрес через поле OVERLAPPED на завершение — где и освобождаю/переразмещаю , за 9 месяце ни одного слета


Ваши 9 месяцев не отменяют утверждения в MSDN по поводу необходимости держать WSABUF до выхода из WSASend (именно до выхода из WSASend, а не до завершения операции).
Re[9]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 17:44
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Ушли ли данные — это вопрос другой. Операция закончилась, ничего уже с ней связанного не будет.


Мы как на разных языках щаз ;)

Это:
if (result != 0 && last_error != WSA_IO_PENDING)
проверка на ОШИБКУ!
Никаким "operation completed immediately" здесь не пахнет!
При "completed immediately":
1. result == 0;
2. как мы знаем завершенка приходит, и ничего дополнительно проверять не надо.
Re[10]: IOCP и WSABUF
От: Michael Chelnokov Украина  
Дата: 11.02.10 17:55
Оценка:
Здравствуйте, 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
Re[11]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 18:09
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Тот факт, что произошла ошибка, никак не отменяет факт немедленного завершения операции.

MC>Это частный случай. Completed immediately and successfully :)

Ты, видимо, в контексте темы пишешь. А я вообще. Криво же написано.
Re[12]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 18:19
Оценка:
Или это такое глобальное обобщение — нет pending-а, значит immediately?
Т.е. предлагают ошибку обрабатывать в рабочем потоке.
Re[13]: IOCP и WSABUF
От: Michael Chelnokov Украина  
Дата: 11.02.10 19:03
Оценка:
Здравствуйте, Gomes, Вы писали:

G>Или это такое глобальное обобщение — нет pending-а, значит immediately?

G>Т.е. предлагают ошибку обрабатывать в рабочем потоке.

А где ее еще обрабатывать, если уведомления не будет?
Все правильно у них написано.
Re[14]: IOCP и WSABUF
От: Gomes Россия http://irazin.ru
Дата: 11.02.10 19:07
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>А где ее еще обрабатывать, если уведомления не будет?


Вариант с возвратом ошибки чем плох?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.