2012-05-24 5 views
2

с использованием сокета с перекрытой операцией выбрало уведомление о завершении на основе событий; Есть 2 события, один для данных, другой, чтобы отменить длинный посыл/ПРИЕМ:WIN32 Socket API: Отмена отправки/возврата в сокет с использованием уведомления о завершении на основе событий

HANDLE events[] = { m_hDataEvent, m_hInterruptEvent }; 

затем призывающую WSASend,

WSASend(m_Socket, &DataBuf, 1, NULL, 0, &SendOverlapped, NULL); 

следует

WSAWaitForMultipleEvents(2, events, FALSE, INFINITE, FALSE); 

, который является установкой для возврата на любом событии. Теперь предположим, что передача выполняется, и сигнализируется m_hInterruptEvent. Возврат WSAWaitForMultipleEvents, технически функция вызова send также может возвращать и удалять встроенные буферы.

Что мне непонятно, WSASend все еще может работать в фоновом режиме, а удаление буферов приведет к повреждению данных в лучшем случае.

Что было бы правильным способом остановить отправку/получение фона, если сокет должен быть немедленно использован для чего-то другого?

Я посмотрел на CancelIO(), но MSDN никогда не упоминает его относительно сокетов, работает ли он только с файловым IO?

ответ

1

Нет смысла пытаться отменить его после отправки. Даже если вы преуспеете, у вас возникнет проблема, потому что принимающее приложение не имеет представления, что передача была прервана. Ваше новое сообщение будет ошибочно принято за конец старого сообщения.

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

  • Отправить в куски и проверить на отмену между кусками. Убедитесь, что у вас есть способ сообщить получателю, что передача была отменена.
  • Закройте гнездо для отмены. Опять же, убедитесь, что у клиента есть способ узнать, что это прерванная передача (например, если клиент знает общую длину заранее, они распознают прерванную передачу).
  • Просто подождите, пока он преуспеет в фоновом режиме и не волнуйтесь. Если у вас есть срочные сообщения, используйте для них отдельное соединение.

Для вашего конкретного вопроса «Что бы правильный способ остановить фон отправки/получения, если нужно использовать что-то другое сразу гнездо», ответ: Sockets дешевы - Просто используйте два - один для медленной передачи другой для срочных сообщений.

+0

То, что вы сказали здесь, имеет смысл, единственная проблема заключается в том, что я ограничен спецификацией протокола и тем фактом, что на сервере разрешено только одно подключение (я работаю на клиенте). Это делает все более сложным, чем должно быть ... Я рассмотрю разбиение больших сообщений на мелкие куски. – Califf