Составители:
Рубрика:
текущее время)
8. Начало передачи данных
Этого достаточно для простого вызова функции connect (). Описанный процесс может быть гораз-
до более сложным, если между клиентом и сервером находятся компьютеры, выполняющие маршрути-
зацию (коммутацию и верификацию пакетов, фрагментацию и дефрагментацию, трансляцию протоко-
лов, туннелирование и т.д.). Библиотека Socket API значительно упрощает сетевое взаимодействие.
Для организации
соединения требуется знать язык и правила сетевого общения. Все начинается с
функции socket(), которая создает аналог телефонной трубки. Через эту "трубку" программа посылает и
принимает сообщения. Чтение и запись данных осуществляются с помощью тех же самых функций
read() и write () которые применяются при работе с файлами. Более сложные системы строятся вокруг
функции recv().
Пример использования библиотеки Socket API
В сетевом соединении всегда есть отправитель и получатель. В общем случае отправителем явля-
ется клиент, который запрашивает сервис, предоставляемый сетевым компьютером. В части I, "Созда-
ние сетевых клиентских приложений", рассматривались основы клиентского программирования: как
подключить клиента к серверу, как организовать прямую доставку сообщений без установления соеди-
нения и как работать с протоколами
стека TCP/IP. С этой главы начинается знакомство с другой сторо-
ной соединения — приемником, или сервером.
Чтобы понять схему взаимодействия клиента и сервера, представьте, что сеть — это телефонная
система большой компании, в которой сервер является центральным телефонным номером, направляю-
щим звонки конкретным служащим. Клиент связывается с требуемым служащим, набирая центральный
и дополнительный
номера. Теперь ситуация проясняется. Центральный номер является адресом сетевого
узла, а дополнительный номер — это порт конкретного сервиса.
Клиент должен знать номер порта, по которому обращается. Это похоже на телефонный номер,
который должен быть где-то опубликован: если клиент не знает номер, он не сможет по нему позвонить.
Ниже мы остановимся на
том, как предоставлять сервисы и шаг за шагом рассматрим процесс
создания сервера.
Схема работы сокета: общий алгоритм сервера
Процесс построения сервера всегда начинается с создания сокета. Подобно тому как в клиентской про-
грамме требуется определенная последовательность системных вызовов, аналогичная последователь-
ность необходима и на сервере, только здесь она длиннее. Если некоторые функции клиенту вызывать
не обязательно, то для серверного приложения все они нужны (Рисунок 2).
Клиентская программа, которую мы писали
в первых главах, вызывала функции в такой последо-
вательности: socket (), connect (), read(), write () и close (). Системный вызов bind() был необязательным,
так как эту функцию вызывала операционная система. Номер порта не требовался, поскольку программа
обращалась напрямую к серверу. Клиент всегда создает активное соединение, потому что он постоянно
его занимает.
С другой стороны, серверные программы должны предоставлять своим
клиентам неизменные,
четко заданные номера портов. Базовая последовательность вызовов здесь будет такой: socket(), bind(),
listen(), accept() и close(). В то время как клиент создает активное соединение, серверное соединение пас-
сивно. Функции listen () и accept () устанавливают соединение только тогда, когда приходит запрос от
клиента.
Знакомство с функцией bind() состоялось выше, сейчас она будет описана более формально. Кро-
ме того
, будут представлены две новые функции: listen () и accept().
текущее время) 8. Начало передачи данных Этого достаточно для простого вызова функции connect (). Описанный процесс может быть гораз- до более сложным, если между клиентом и сервером находятся компьютеры, выполняющие маршрути- зацию (коммутацию и верификацию пакетов, фрагментацию и дефрагментацию, трансляцию протоко- лов, туннелирование и т.д.). Библиотека Socket API значительно упрощает сетевое взаимодействие. Для организации соединения требуется знать язык и правила сетевого общения. Все начинается с функции socket(), которая создает аналог телефонной трубки. Через эту "трубку" программа посылает и принимает сообщения. Чтение и запись данных осуществляются с помощью тех же самых функций read() и write () которые применяются при работе с файлами. Более сложные системы строятся вокруг функции recv(). Пример использования библиотеки Socket API В сетевом соединении всегда есть отправитель и получатель. В общем случае отправителем явля- ется клиент, который запрашивает сервис, предоставляемый сетевым компьютером. В части I, "Созда- ние сетевых клиентских приложений", рассматривались основы клиентского программирования: как подключить клиента к серверу, как организовать прямую доставку сообщений без установления соеди- нения и как работать с протоколами стека TCP/IP. С этой главы начинается знакомство с другой сторо- ной соединения — приемником, или сервером. Чтобы понять схему взаимодействия клиента и сервера, представьте, что сеть — это телефонная система большой компании, в которой сервер является центральным телефонным номером, направляю- щим звонки конкретным служащим. Клиент связывается с требуемым служащим, набирая центральный и дополнительный номера. Теперь ситуация проясняется. Центральный номер является адресом сетевого узла, а дополнительный номер — это порт конкретного сервиса. Клиент должен знать номер порта, по которому обращается. Это похоже на телефонный номер, который должен быть где-то опубликован: если клиент не знает номер, он не сможет по нему позвонить. Ниже мы остановимся на том, как предоставлять сервисы и шаг за шагом рассматрим процесс создания сервера. Схема работы сокета: общий алгоритм сервера Процесс построения сервера всегда начинается с создания сокета. Подобно тому как в клиентской про- грамме требуется определенная последовательность системных вызовов, аналогичная последователь- ность необходима и на сервере, только здесь она длиннее. Если некоторые функции клиенту вызывать не обязательно, то для серверного приложения все они нужны (Рисунок 2). Клиентская программа, которую мы писали в первых главах, вызывала функции в такой последо- вательности: socket (), connect (), read(), write () и close (). Системный вызов bind() был необязательным, так как эту функцию вызывала операционная система. Номер порта не требовался, поскольку программа обращалась напрямую к серверу. Клиент всегда создает активное соединение, потому что он постоянно его занимает. С другой стороны, серверные программы должны предоставлять своим клиентам неизменные, четко заданные номера портов. Базовая последовательность вызовов здесь будет такой: socket(), bind(), listen(), accept() и close(). В то время как клиент создает активное соединение, серверное соединение пас- сивно. Функции listen () и accept () устанавливают соединение только тогда, когда приходит запрос от клиента. Знакомство с функцией bind() состоялось выше, сейчас она будет описана более формально. Кро- ме того, будут представлены две новые функции: listen () и accept().
Страницы
- « первая
- ‹ предыдущая
- …
- 10
- 11
- 12
- 13
- 14
- …
- следующая ›
- последняя »