В этом фрагменте кода вызывается функция send () для передачи символа “а” через сокет $socket. Флажок MSG_OOB указывает, что сообщение — срочное и должно быть доставлено немедленно. На другом конце получатель сообщения может прочитать срочные данные путем вызова функции recv () с тем же флажком.
recv ($socket $data, 1,MSG_OOB) or die "Can't recv() : $!";
Здесь функция recv () была использована для получения одного байта срочных данных из сокета и сохранения его в скаляре $data. При необходимости функция recv () может получить гораздо больший объем данных, к примеру, веб страницу, на которой описана подготовка к свадьбе , советы и рекомендации.
Эти операции выглядят довольно просто, но за внешней простотой скрываются значительные сложности. Хотя термин “внеочередные” наводит на мысль, что данные передаются вне обычного потока данных, в действительности дело обстоит иначе.
Срочные данные передаются по принципу, который проиллюстрирован ниже. Во время выполнения обычных операций TCP процесс-отправитель последовательно помещает данные в передающий буфер TCP операционной системы. Содержимое буфера передается по сети и в конечном итоге попадает в приемный буфер TCP на хосте назначения. Теперь предположим, что процесс-отправитель послал один байт срочных данных путем вызова функции send () с флажком MSG_OOB. В результате выполняются следующие действия.
1) Поток TCP переводится в режим срочной передачи URGENT и операционная система извещает об этом процесс-получатель, отправив ему сигнал URG.
2) Срочные данные добавляются к передающему буферу, откуда они будут отправлены процессу-получателю с использованием обычных правил управлении потоком данных TCP.
3) К потоку TCP добавляется маркер, известный как “указатель срочных данных", который отмечает положение срочных данных. В каждом потоке TCP должен находиться только один указатель срочных данных.