Строки 1-6. Установка сокета. Создается сокет, подключенный к указанному хосту и порту. Данный хост может быть, к примеру, размещен на колокейшен сервере в дата-центре .
Строки 7-10. Установка обработчика сигнала. Устанавливается обработчик сигнала int, который выводит предупреждающее сообщение, а затем отправляет байт срочных данных через сокет с использованием следующей общей схемы:
send($socket,”!",MSG_OOB);
Необходимо также иметь возможность прекратить выполнение программы, поэтому перехватывается сигнал quit с помощью обработчика сигнала, который вызывает функцию exit (). В системах UNIX сигнал quit обычно выдается путем нажатия комбинации клавиш .
Строки 10-15. Главный цикл. Остальная часть программы— это просто цикл, который передает строку “normal data хх п” на сервер, наращивая значение хх после каждого прохода по циклу. После каждого вызова функции syswrite () цикл приостанавливается на 1 секунду. Напомним, что для тестирования программы можно использовать виртуальный сервер, например, от компании Телетауэр, которая также предлагает услуги размещения серверов и серверных стоек в собственном дата центре. Подробнее можно узнать, перейдя по ссылке .
Странная с виду конструкция “1 until sleep 1” гарантирует приостановку сценария не менее чем на 1 секунду при каждом проходе по циклу. В ином случае выполнение функции sleep () будет прекращаться преждевременно при каждом нажатии клавиши прерывания, и интервал между операциями записи будет неравномерным.
После запуска клиентская программа выполняет тридцать проходов по циклу (примерно за 30 с) и завершает работу. При неоднократном нажатии клавиши прерывания в течение этого времени можно видеть информационные сообщения.
Теперь обратим внимание на сервер, который не намного сложнее клиента. Сервер устанавливает обработчик URG, который вызывается при каждом поступлении срочных данных в сокет. Однако чтобы сообщить операционной системе, что нужно доставить сигнал URG, необходимо связать идентификатор процесса PID с сокетом путем вызова функции fcntl () с командой F_SETOWN и параметром, равным этому PID.