Поделиться через


Данные независимой от передачи протокола в SPI

Данные вне диапазона (OOB) — это логически независимый канал передачи, связанный с парой подключенных сокетов потоков. Данные OOB могут быть доставлены пользователю независимо от обычных данных. Абстракция определяет, что объекты данных OOB должны поддерживать надежную доставку по крайней мере одного блока данных OOB за раз. Этот блок данных может содержать по крайней мере один байт данных, и хотя бы один блок данных OOB может находиться в ожидании доставки пользователю в любое время. Для протоколов связи, поддерживающих передачу сигналов в диапазоне (то есть TCP, где срочные данные доставляются в последовательности с обычными данными), система обычно извлекает данные OOB из обычного потока данных и сохраняет их отдельно (оставляя пробел в обычном потоке данных). Это позволяет пользователям выбирать между получением данных OOB и получением их вне последовательности без необходимости буферизировать все промежуточные данные. Вы можете просмотреть данные OOB.

Пользователь может определить, есть ли какие-либо данные OOB, ожидающие чтения с помощью функции WSPIoctl (SIOCATMARK). Для протоколов, в которых концепция положения блока данных OOB в обычном потоке данных имеет смысл (то есть TCP), поставщик служб сокетов Windows будет поддерживать концептуальный маркер, указывающий положение последнего байта данных OOB в обычном потоке данных. Это не обязательно для реализации функций WSPIoctl (SIOCATMARK) — наличие или отсутствие данных OOB является обязательным.

Для протоколов, в которых концепция положения блока данных OOB в обычном потоке данных имеет смысл, приложение может предпочесть обрабатывать внеполновые данные в рамках обычного потока данных. Это достигается путем установки параметра сокета SO_OOBINLINE (см. раздел WSPIoctl). Для других протоколов, в которых блоки данных OOB действительно не зависят от обычного потока данных, попытка задать SO_OOBINLINE приведет к ошибке. Приложение может использовать команду SIOCATMARK WSPIoctl для определения наличия непрочитанных данных OOB перед меткой. Например, он может использовать это для повторной синхронизации с его одноранговым элементом, гарантируя, что все данные до отметки в потоке данных удаляются при необходимости.

Если SO_OOBINLINE отключен (по умолчанию):

  • Поставщик услуг Winsock уведомляет клиента события FD_OOB, если клиент зарегистрировался для уведомления с WSPAsyncSelect, точно так же, как FD_READ используется для уведомления о присутствии обычных данных. То есть, FD_OOB публикуется при поступлении данных OOB и не было данных OOB, ранее в очереди, а также при чтении данных с помощью флага MSG_OOB, а некоторые данные OOB остаются считываемыми после возврата операции чтения. FD_READ сообщения не публикуются для данных OOB.
  • Поставщик служб Winsock возвращает WSPSelect с соответствующими за исключением сокетов, если данные OOB в очереди в сокете.
  • Клиент может вызывать WSPRecv с MSG_OOB для чтения срочного блока данных в любое время. Блок данных OOB переходит к очереди.
  • Клиент может вызывать WSPRecv без MSG_OOB для чтения обычного потока данных. Блок данных OOB не будет отображаться в потоке данных с обычными данными. Если данные OOB остаются после любого вызова WSPRecv, поставщик услуг уведомляет клиента FD_OOB или через кроме при использовании WSPSelect.
  • Для протоколов, в которых данные OOB имеют позицию в обычном потоке данных, одна операция WSPRecv не будет охватывать эту позицию. Один WSPRecv вернет обычные данные перед меткой, а второй WSPRecv требуется для начала чтения данных после отметки.

С включенным SO_OOBINLINE:

  • FD_OOB сообщения не публикуются для данных OOB — для целей WSPSelect и функции WSPAsyncSelect данные OOB обрабатываются как обычные данные и указываются путем установки сокета в чтения или отправки сообщения FD_READ соответственно.
  • Клиент не может вызывать WSPRecv с флагом MSG_OOB, установленным для чтения блока данных OOB, — код ошибки WSAEINVAL будет возвращен.
  • Клиент может вызывать WSPRecv без набора флагов MSG_OOB. Все данные OOB будут доставлены в правильном порядке в обычном потоке данных. Данные OOB никогда не будут смешанными с обычными данными. Для получения данных OOB необходимо три запроса на чтение. Первый возвращает обычные данные до блока данных OOB, второй возвращает данные OOB, третий возвращает обычные данные после данных OOB. Другими словами, границы блока данных OOB сохраняются.

ПодпрограммаWSPAsyncSelect особенно хорошо подходит для обработки уведомлений о присутствии данных OOB при отключении SO_OOBINLINE.