Re[2]: Корректное завершение в обработчике TDI_EVENT_RECEIVE
От: Аноним  
Дата: 23.08.11 12:17
Оценка:
Здравствуйте, x64, Вы писали:

А>>...как корректно завершать сессию подключения в своём установленном обработчике TDI_EVENT_RECEIVE/TDI_EVENT_RECEIVE_EXPEDITED.


x64>Вопрос не очень понятен. Что именно нужно сделать в обработчике ClientEventReceive? Варианта обычно только три: или надо разорвать ещё активное соединение, или надо что-то сделать в ситуации, когда в этом обработчике стало известно, что соединение будет разорвано или уже в процессе завершения, или нужно временно блокировать приходящие данные (для конкретного соединения или для всех сразу). В первом случае нужно асинхронно послать запрос TDI_DISCONNECT транспорту (или нижележащему фильтру, не важно) с флагом TDI_DISCONNECT_ABORT, затем в *BytesTaken указать столько байт, сколько показано в BytesAvailable, и вернуть STATUS_SUCCESS. Во втором случае лучше всего, думаю, вернуть STATUS_DATA_NOT_ACCEPTED, хотя вообще-то эта ситуация маловероятна. И, наконец, в третьем случае либо ставим в *BytesTaken значение из BytesIndicated и возвращаем STATUS_SUCCESS, либо, если данные необходимо придержать до некоторого момента, то их надо где-то сохранить в очереди, чтобы потом передать клиенту. В последнем случае логика слегка навороченная будет, но если просто разрешать/запрещать трафик, то это всё не нужно.


Большое спасибо! К сожалению, +1 поставить не получается, ну не суть.

А интересно, если блокировать получение трафа в обработчике TDI_EVENT_RECEIVE/TDI_EVENT_RECEIVE_EXPEDITED, то нужно ли при этом блокировать так же приходящие TDI_RECEIVE/TDI_RECEIVE_DATAGRAM извне в самом фильтре?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.