Подтвердить что ты не робот

Программирование сокетов: как обрабатывать данные вне диапазона

Я просто просмотрел запись в википедии на внеполосных данных, и насколько я понимаю, данные OOB как-то помечены как более важные и обрабатываются как обычные данные, но передаются в отдельном потоке, что глубоко меня смущает.

Фактический вопрос будет (кроме "Может ли кто-нибудь объяснить, что такое данные OOB?" ):

Я пишу приложение unix, которое использует сокеты и должно использовать select() и задавалось вопросом, что делать с exceptfds параметр? Нужно ли мне вставлять все мои сокеты в этот параметр и реагировать на такие события? Или я просто игнорирую их?

4b9b3361

Ответ 1

Я знаю, что вы решили, что вам не нужно обрабатывать данные OOB, но вот некоторые вещи, которые следует иметь в виду, если вы когда-либо делаете заботиться о OOB...

  • IPv4 действительно не передает данные OOB на отдельный канал или с другим приоритетом. Это просто флаг в пакете.
  • Данные OOB крайне ограничены - 1 байт!
  • Данные OOB могут быть получены как встроенными, так и отдельно в зависимости от параметров сокета
  • Данные OOB с информацией об исключении могут возникать, даже если следующее чтение не содержит данных OOB (сетевой стек отправителя может отмечать любые уже поставленные в очередь данные, поэтому другая сторона будет знать там OOB ASAP). Это часто обрабатывается путем ввода цикла "стока", в котором вы удаляете данные до тех пор, пока не будут доступны фактические данные OOB.

Если это кажется немного запутанным и бесполезным, это потому, что это в основном. Есть веские причины использовать OOB, но это редко. Одним из примеров является FTP, где пользователь может находиться в середине большой передачи, но решил отказаться. Отмена отправляется как данные OOB. В этот момент сервер и клиент просто едят любые "нормальные" данные, чтобы слить все, что еще находится в пути. Если прерывание было обработано в соответствии с данными, тогда весь выдающийся трафик должен быть обработан, только чтобы быть сброшенным.

Хорошо знать, что OOB существует и основы того, как он работает, на случай, если вам это понадобится. Но не утруждайте себя изучением наизнанку, если вам просто не интересно. Скорее всего, вы никогда не сможете его использовать.

Ответ 2

Я думаю, что нашел ответ на этой странице. Короче говоря:

Мне не нужно обрабатывать данные OOB на принимающей стороне, если я не отправляю данные OOB. Я думал, что данные OOB могут быть сгенерированы ОС отправителя.

Ответ 3

"Может кто-нибудь объяснить, что такое данные OOB?"

В терминах связи (O-Of-Band) OOB просто означает вредоносный пакет, который содержит Urgent Pointer (URG flage в TCP Packet).

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

Из WIKI 1 По данным OOB One может прерывать или прерывать поток в очереди, а не ждать завершения потока. Это делается путем указания данных как срочных. Это сообщает программе приема немедленно обрабатывать ее вместе с остальными неотложными данными. По завершении TCP сообщает приложение и возвращается обратно в очередь потока. Например, когда TCP используется для сеанса удаленного входа, пользователь может отправить последовательность клавиатуры, которая прерывает или прерывает программу на другом конце. Эти сигналы чаще всего необходимы, когда программа на удаленном компьютере не работает правильно. Сигналы должны быть отправлены, не дожидаясь завершения текущей передачи программы. Данные TCP OOB не были разработаны для современного Интернета. Указатель срочности только изменяет обработку на удаленном хосте и не ускоряет обработку в самой сети. Когда он добирается до удаленного хоста, есть две несколько разные интерпретации протокола, что означает, что только одиночные байты данных OOB являются надежными. Это предполагает, что он является надежным вообще, поскольку он является одним из наименее часто используемых элементов протокола и, как правило, плохо реализуется.

Ответ 4

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