Обзор сокетов
Библиотека Winsock поддерживает два вида сокетов - синхронные (блокируемые) и асинхронные (неблокируемые). Синхронные сокеты задерживают управление на время выполнения операции, а асинхронные возвращают его немедленно, продолжая выполнение в фоновом режиме, и, закончив работу, уведомляют об этом вызывающий код.
ОС Windows 3.x поддерживает только асинхронные сокеты, поскольку, в среде с корпоративной многозадачностью захват управления одной задачей "подвешивает" все остальные, включая и саму систему. ОС Windows 9x\NT поддерживают оба вида сокетов, однако, в силу того, что синхронные сокеты программируются более просто, чем асинхронные, последние не получили большого распространения. Эта статья посвящена исключительно синхронным сокетам (асинхронные - тема отдельного разговора).
Сокеты позволяют работать со множеством протоколов и являются удобным средством межпроцессорного взаимодействия, но в данной статье речь будет идти только о сокетах семейства протоколов TCP/IP, использующихся для обмена данными между узлами сети Интернет. Все остальные протоколы, такие как IPX/SPX, NetBIOS по причине ограниченности объема журнальной статьи рассматриваться не будут.
Независимо от вида, сокеты делятся на два типа - потоковые и дейтаграммные. Потоковые сокеты работают с установкой соединения, обеспечивая надежную идентификацию обоих сторон и гарантируют целостность и успешность доставки данных. Дейтаграмные сокеты работают без установки соединения и не обеспечивают ни идентификации отправителя, ни контроля успешности доставки данных, зато они заметно быстрее потоковых.
Выбор того или иного типа сокетов определяется транспортным протоколом на котором работает сервер, - клиент не может по своему желанию установить с дейтаграммным сервером потоковое соединение.
Замечание: дейтаграммные сокеты опираются на протокол UDP, а потоковые на TCP.
Зарезервированные сокеты
После физического подключения выбирается протокол высокого уровня, который зависит от используемого порта. Согласно спецификации протокола TCP/IP, первые 1024 порта резервируются для определенных задач. Порт номер 21 предназначен для протокола FTP, 23 – для Telnet, 25 – для электронной почты, 79 – для протокола finger, 80 – для HTTP, и т.д. Каждый протокол определяет, каким образом клиент должен взаимодействовать с портом. Например, протокол HTTP используется Web-броузерами и серверами для передачи гипертекстовых страниц и изображений. Работает он следующим образом. Когда клиент запрашивает файл от сервера HTTP (это действие известно под названием попадание – hit), он просто записывает имя файла в специальном формате в определенный порт и получает обратно содержимое файла. Сервер также возвращает код состояния, сообщающий клиенту о возможности удовлетворения запроса, и причину отказа.. Вот пример запроса клиентом файла /index.html, в ответ на который сервер передает содержимое файла.
37. Программирование сокетов
Для обеспечения сетевых коммуникаций используются сокеты. Сокет это конечная точка сетевых коммуникаций. Каждый использующийся сокет имеет тип и ассоциированный с ним процесс. Сокеты существуют внутри коммуникационных доменов. Домены это абстракции, которые подразумевают конкретную структуру адресации и множество протоколов, которое определяет различные типы сокетов внутри домена. Примерами коммуникационных доменов могут быть: UNIX домен, Internet домен, и т.д.
В Internet домене сокет - это комбинация IP адреса и номера порта, которая однозначно определяет отдельный сетевой процесс во всей глобальной сети Internet. Два сокета, один для хоста-получателя, другой для хоста-отправителя, определяют соединение для протоколов, ориентированных на установление связи, таких, как TCP.
Создание сокета
Привязка к локальным именам
Установление связи
Передача данных
Закрывание сокетов
Пример функции, для установления WWW коннекции
Создание сокета
Для создания сокета используется системный вызов socket.
s = socket(domain, type, protocol);
Этот вызов основывается на информации о коммуникационном домене и типе сокета. Для использования особенностей Internet, значения параметров должны быть следующими:
communication domain - AF_INET (Internet протоколы).
type of the socket - SOCK_STREAM; Этот тип обеспечивает последовательный, надежный, ориентированный на установление двусторонней связи поток байтов.
Выше был упомянут сокет с типом stream. Краткое описание других типов сокетов приведено ниже:
Datagram socket - поддерживает двусторонний поток данных. Не гарантируется, что этот поток будет последовательным, надежным, и что данные не будут дублироваться. Важной характеристикой данного сокета является то, что границы записи данных предопределены.
Raw socket - обеспечивает возможность пользовательского доступа к низлежащим коммуникационным протоколам, поддерживающим сокет-абстракции. Такие сокеты обычно являются датаграм- ориентированными.
Функция socket создает конечную точку для коммуникаций и возвращает файловый дескриптор, ссылающийся на сокет, или -1 в случае ошибки. Данный дескриптор используется в дальнейшем для установления связи.
Для создания сокета типа stream с протоколом TCP, обеспечивающим коммуникационную поддержку, вызов функции socket должен быть следующим:
s = socket(AF_INET, SOCK_STREAM, 0);
Привязка к локальным именам
Сокет создается без имени. Пока с сокетом не будет связано имя, удаленные процессы не имеют возможности ссылаться на него и, следовательно, на данном сокете не может быть получено никаких сообщений. Коммуникационные процессы используют для данных целей ассоциации. В Internet домене ассоциация складывается из локального и удаленного адреса и из локального и удаленного порта. В большинстве доменов ассоциация должна быть уникальной.
В Internet домене связывание сокета и имени может быть весьма сложным, но, к счастью, обычно нет необходимости специально привязывать адрес и номер порта к сокету, так как функции connect и send автоматически свяжут данный сокет с подходящим адресом, если это не было сделано до их вызова.
Для связывания сокета с адресом и номером порта используют системный вызов bind:
bind(s, name, namelen);
Привязываемое имя (name) это строка байт переменной длины, которая интерпретируется поддерживаемым протоколом. Интерпретация может различаться в различных коммуникационных доменах.
Установление связи
Со стороны клиента связь устанавливается с помощью стандартной функции connect:
error = connect(s, serveraddr, serveraddrlen);
которая инициирует установление связи на сокете, используя дескриптор сокета s и информацию из структуры serveraddr, имеющей тип sockaddr_in, которая содержит адрес сервера и номер порта на который надо установить связь. Если сокет не был связан с адресом, connect автоматически вызовет системную функцию bind.
Connect возвращает 0, если вызов прошел успешно. Возвращенная величина -1 указывает на то, что в процессе установления связи произошла некая ошибка. В случае успешного вызова функции процесс может работать с дескриптором сокета, используя функции read и write, и закрывать канал используя функцию close.
Со стороны сервера процесс установления связи сложнее. Когда сервер желает предложить один из своих сервисов, он связывает сокет с общеизвестным адресом, ассоциирующимся с данным сервисом, и пассивно слушает этот сокет. Для этих целей используется системный вызов listen:
error = listen(s, qlength);
где s это дескриптор сокета, а qlength это максимальное количество запросов на установление связи, которые могут стоять в очереди, ожидая обработки сервером; это количество может быть ограничено особенностями системы.
Когда сервер получает запрос от клиента и принимает решение об установлении связи, он создает новый сокет и связывает его с ассоциацией, эквивалентной 'слушающему сокету'. Для Internet домена это означает тот же самый номер порта. Для этой цели используется системный вызов accept:
newsock = accept(s, clientaddr, clientaddrlen);
Сокет, ассоциированный клиентом, и сокет, который был возвращен функцией accept, используются для установления связи между сервером и клиентом.
Передача данных
Когда связь установлена, с помощью различных функций может начаться процесс передачи данных. При наличии связи, пользователь может посылать и получать сообщения с помощью функций read и write:
write(s, buf, sizeof(buf)); read(s, buf, sizeof(buf));
Вызовы send и recv практически идентичны read и write, за исключением того, что добавляется аргумент флагов.
send(s, buf, sizeof(buf), flags); recv(s, buf, sizeof(buf), flags);
Могут быть указаны один или более флагов с помощью ненулевых значений, таких, как следующие:
MSG_OOB - Посылать/получать данные, характерные для сокетов типа stream.
MSG_PEEK - Просматривать данные без чтения. когда указывается в recv, любые присутствующие данные возвращаются пользователю, но сами данные остаются как "непрочитанные". Следующий read или recv вызванный на данном сокете вернет прочитанные в прошлый раз данные.
MSG_DONTROUTE - посылать данные без маршрутизации пакетов. (Используется только процессами, управляющими таблицами маршрутизации.)
Закрывание сокетов
Когда взаимодействующие модули решают прекратить передачу данных и закрыть сеанс связи, они обмениваются трехсторонним рукопожатием с сегментами, содержащими установленный бит "От отправителя больше нет данных" (этот бит еще называется FIN бит).
Если сокет больше не используется, процесс может закрыть его с помощью функции close, вызвав ее с соответствующим дескриптором сокета:
close(s);
Если данные были ассоциированы с сокетом, обещающим доставку (сокет типа stream), система будет пытаться осуществить передачу этих данных. Тем не менее, по истечении довольно таки длительного промежутка времени, если данные все еще не доставлены, они будут отброшены. Если пользовательский процесс желает прекратить любую передачу данных, он может сделать это с помощью вызова shutdown на данном сокете для его закрытия. Вызов shutdown вызывает "моментальное" отбрасывание всех стоящих в очереди данных. Формат вызова следующий:
shutdown(s, how);
где how имеет одно из следующих значений:
0 - если пользователь больше не желает читать данные
1 - если данные больше не будут посылаться
2 - если данные не будут ни посылаться ни получаться
Пример функции, для установления WWW коннекции
int MakeConnection(unsigned char* ServerName){
int s;
struct sockaddr_in ssin;
struct hostent* hp;
int PortNum;
unsigned char strHlp[STRNGLEN], *pch;
/* use default port number - 80 or specific number from the
server name */
strcpy(strHlp,ServerName);
pch = strchr(strHlp,':');
if(pch==NULL){
PortNum = 80;
}else{
pch[0] = '';
pch++;
PortNum = atoi(pch);
if(PortNum==0){
PortNum = 80;
}
}
/* get host by name - resolve host name into IP address */
if( (hp=gethostbyname(strHlp)) == NULL )
{
return -1;
}
bzero(&ssin, sizeof(ssin));
bcopy(hp->h_addr, &ssin.sin_addr, hp->h_length);
ssin.sin_family = hp->h_addrtype;
ssin.sin_port = htons(PortNum);
/* allocate a socket */
if((s=socket(AF_INET, SOCK_STREAM, 0))==-1)
{
return -1;
}
/* make a connection */
if(connect(s, &ssin, sizeof(ssin), 0)==-1){
return -1;
}
return s; /* socket descriptor */
}
- Локальные сети эвм. Способы связи эвм между собой.
- Сети эвм. Классификация сетей.
- Локальные сети эвм. Физические стандарты каналов связи.
- 4. Локальные сети эвм. Понятие о топологии сети.
- 5. Локальные сети эвм. Шинная топологии, достоинства и недостатки.
- 6. Локальные сети эвм. Звездообразная и кольцевая топологии, достоинства и недостатки.
- 1 Звезда
- 2 Кольцо
- 3 Общая шина
- 4 Иерархическая топология
- 7. Windows xp - современное средство построения одноранговых лвс
- Использование Мастера настройки сети
- Конфигурирование сети вручную
- 8. Основные протоколы логического уровня в современных сетевых ос
- 9. Кабельные системы сетей эвм. Коаксиальные кабели и витая пара.
- Кабели на основе неэкранированной витой пары
- Кабели на основе экранированной витой пары
- Коаксиальные кабели
- Вопрос №12 Программные средства лвс. Сетевые операционные системы Сетевые операционные системы Структура сетевой операционной системы
- Одноранговые сетевые ос и ос с выделенными серверами
- Ос для рабочих групп и ос для сетей масштаба предприятия
- Обзор сетевых операционных систем
- Протокол sap и Novell Directory Services
- 14. Сетевая ос windows 2000/nt. Структура, протоколы, основные характеристики.
- Билет 15. Классификация современных сетей передачи и обработки информации. Классификация вычислительных сетей
- Конфигурация вычислительной сети и методы доступа Топология вычислительной сети
- Виды топологий
- Общая шина
- Классификация сетей по территориальному признаку. Примеры сетей.
- Сеть internet - объединение общемировых сетей передачи информации.
- 18. Internet - принципы построения.
- 19. Протокол tcp/ip основа построения internet.
- 20. Логическая структура лвс. Одно и двух ранговые лвс.
- 22. Логическая структура лвс. Файловые серверы и серверы приложений.
- 23. Протоколы http и ftp - основные средства нижнего уровня в www.
- Служба организации электронной почты (источник - конспект лекций)
- 26. Понятие сети, ресурсы, их использование
- Понятие сети
- Ресурсы
- Ресурсы, их использование
- 27. Файл-серверная и клиент-серверная технологии
- Файл-серверная технология
- Технология клиент-сервер
- Недостатки Клиент-серверной архитектуры
- 28. Программные средства сетевого доступа к данным (sql-серверы и т.П.)
- 29. Сетевая архитектура. Физическая и логическая топология
- Виды топологий
- Сетевые карты
- Вопрос № 31 Сетевое оборудование. Коммутаторы, концентраторы, маршрутизаторы, мосты и т.П.
- 32. Модель взаимодействия открытых систем (osi)
- 33. Сетевые протоколы
- 34 Протоколы tcp/ip.
- Основы tcp/ip
- Краткое описание протоколов семейства tcp/ip с расшифровкой аббревиатур
- Архитектура tcp/ip
- Уровни сетей и протоколы tcp/ip
- Краткое заключение
- 35: Маршрутизация tcp/ip, локальные и глобальные ip-адреса Типы адресов: физический (mac-адрес), сетевой (ip-адрес) и символьный (dns-имя)
- Отображение физических адресов на ip-адреса: протоколы arp и rarp
- 36. Понятие сокета
- Обзор сокетов
- 38. Сетевое программное обеспечение лвс и компоненты лвс
- Основные компоненты
- Рабочие станции
- Сетевые адаптеры
- Файловые серверы
- Сетевые операционные системы
- Сетевое программное обеспечение
- 39. Сеть из двух компьютеров
- 40. Сети Windows nt/2000. Понятие сервера и рабочей станции.
- 41. Базовый состав сетевого по Windows.
- 41.1 Состав сетевого клиентского по
- 41.2 Краткое описание утилит
- 41.3 Утилиты для диагностики tcp/ip соединений
- 43. Доменная модель.
- 44. Учетные записи и группы пользователей
- 45. Функции администратора Windows nt
- 46. Защита сетевых ресурсов с помощью прав доступа.
- 47. Понятие файловой системы.
- 48. Защита ресурсов с помощью разрешений ntfs.
- 49. Технология ethernet
- 50. Понятие о службах dns, wins, dhcp.
- 51. Пример сети небольшого предприятия.
- 52. Технология token ring
- Параметры и настройка подключения к Интернет
- 55. Методы поиска информации в Интернет
- Структура поисковых сервисов Интернета. Поисковые машины и каталоги
- Метапоисковые системы
- Типы файлов, используемых в Интернет
- Почта. РорЗ/smtp и http доступ к почте
- Html и создание сайтов