Служба DAYTIME

Стандарты TCP/IP определяют прикладной протокол, который позволяет пользователю получить сведения о дате и времени суток в формате, предназначенном для восприятия человеком. Эта служба носит официальное название DAYTIME.

Для доступа к службе DAYTIME пользователь вызывает клиентское приложение. Клиент обращается к серверу для получения информации, а затем выводит ее на экран. Хотя в стандарте не определен точный синтаксис, в нем предложено несколько возможных форматов. Например, служба DAYTIME может вывести дату в формате, представляющем информацию о дне недели, месяце и числе, годе, времени суток и часовом поясе:

weekday, month day, year time-timezone 

примерно так:

Thursday, February 22, 1996 17:37:43-PST 

Стандарт определяет, что служба DAYTIME может применяться для работы и с протоколом TCP, и с протоколом UDP. В обоих случаях в ней используется порт протокола 13.

В версии службы DAYTIME для протокола TCP сигналом к активизации вывода является появление запроса на установление соединения TCP: сразу после получения нового запроса на установление соединения сервер формирует текстовую строку, содержащую текущую дату и время, передает эту строку, а затем закрывает соединение. Таким образом, клиент вообще не должен передавать никаких запросов. По существу, стандарт даже определяет, что сервер должен отбрасывать любые данные, переданные клиентом. У нас отводы бесшовные дешево.

Версия службы DAYTIME для протокола UDP требует отправки клиентом запроса. Запрос состоит из произвольной дейтаграммы UDP. При получении сервером каждой дейтаграммы он форматирует строку с отметкой текущей даты и времени, помещает ее в исходящую дейтаграмму и отправляет этот ответ клиенту. После передачи ответа сервер отбрасывает дейтаграмму, активизировавшую его ответ.

7.10. Реализация клиента TCP для службы DAYTIME

Пространства номеров портов TCP и UDP являются независимыми; применение одного и того же номера порта для данной службы при работе с обоими протоколами не является обязательным, а также не все службы доступны через оба протокола.

/*------------------------------------------------------------------------------- * Процедура TCPdaytime - вызывает службу DAYTIME на указанном хосте и выводит * результаты * „ */ TCPdaytime(const char *host, const char *service) { char buf[LINELEN+1]; /* Буфер для одной строки текста */ int s, n; /* Дескриптор сокета и число операций чтения */ s = connectTCP(host, service); while( (n = read(s, buf, LINELEN))> 0) { buf[n] = '\0'; /* Обеспечить наличие нулевого символа */ /* в конце строки */ (void) fputs( buf, stdout ); } }

Обратите внимание, насколько упрощается код благодаря использованию процедуры connectTCP. Сразу после установления соединения служба DAYTIME просто считывает и выводит входные данные, полученные из соединения, повторяя эту операцию в цикле до тех пор, пока не будет обнаружен признак конца файла.

7.11. Чтение данных из соединения TCP

Пример службы DAYTIME иллюстрирует один важный принцип: протокол TCP предоставляет потоковую службу, которая не гарантирует соблюдение границ между записями. На практике такая потоковая организация передачи данных означает, что протокол TCP вносит "рассогласование" между передающими и принимающими приложениями. Например, предположим, что передающее приложение отправило 64 байта данных в одном вызове функции send, а затем отправило 64 байта во втором вызове. Принимающее приложение может получить все 128 байтов в одном вызове функции read или же получить 10 байтов в первом вызове, 100 байтов во втором и 18 — в третьем. Число байтов, возвращенных в результате вызова, зависит от размера дейтаграмм в базовой объединенной сети, от наличия места в буфере и от задержек, возникающих при прохождении данных по объединенной сети.

Поскольку потоковая служба TCP не гарантирует доставки данных в виде таких же блоков, в каких они были отправлены, в приложении, принимающем данные из соединения TCP, нельзя полагаться на то, что все данные будут доставлены в одной передаче; в нем необходимо повторно вызывать функцию recv (или read) до тек пор, пока не будут получены все данные.

7.12. Служба TIME

В стандартах TCP/IP определена служба, позволяющая одному компьютеру получить значение текущей даты и времени суток от другого. Эта служба, которая носит официальное название TIME, является исключительно простой: клиентская программа, выполняемая на одном компьютере, отправляет запрос на сервер, работающий на другом компьютере. При поступлении запроса сервер получает текущую дату и время суток от локальной операционной системы, представляет эту информацию в стандартном формате и передает ее клиенту в виде ответа.

Для предотвращения проблем, возникающих в том случае, если клиентский и серверный компьютер находятся в разных часовых поясах, протокол TIME определяет, что вся информация времени и даты должна быть представлена во всемирном координированном времени (Universal Coordinated Time), для обозначения которого применяется аббревиатура UCT или UT. Таким образом, сервер перед передачей ответа преобразовывает локальное время во всемирное, а клиент преобразовывает всемирное время в локальное после получения ответа.

В отличие от службы DAYTIME, которая возвращает результаты в формате, предназначенном для восприятия человеком, служба TIME возвращает результаты в формате, предназначенном для программ, которые записывают в память или выполняют другие действия с отметками времени. Программное обеспечение протокола TIME всегда задает время в виде 32-битовых целых чисел, представляющих число секунд, истекших с начала эпохи. В протоколе TIME началом эпохи считается полночь 1 января 1900 года.

Применение целочисленного представления позволяет быстро передавать время с одного компьютера на другой, без преобразования его вначале в текстовую строку, а затем снова в целое число. Поэтому служба TIME позволяет устанавливать аппаратные часы на одном компьютере по часам другого компьютера.

Похожие статьи Меню Опрос Фото Популярное
rss