Программирование POSIX сокет. Сукиязов С.А. - 6 стр.

UptoLike

Составители: 

int sd;
sd = socket(PF_INET, SOCK_STREAM, 0);
В переменную sd будет записан дескриптор сокета, функционально эквивалентный дескриптору
файла:
int fd;
fd = open(...);
В случае возникновения ошибки функция socket () возвращает отрицательное число и помещает
код ошибки в стандартную библиотечную переменную errno. Вот наиболее распространенные коды
ошибок.
• EPROTONOSUPPORT. Тип протокола или указанный протокол не поддерживаются в данном
домене. В большинстве доменов параметр protocol должен равняться нулю.
• EACCES. Отсутствует разрешение на создание сокета указанного типа. При создании сокетов
типа SOCK_RAW и
PF_PACKET программа должна иметь привилегии пользователя root.
• EINVAL.
Неизвестный протокол либо семейство протоколов недоступно. Данная ошибка может
возникнуть при неправильном указании параметра domain или type.
Конечно же, следует знать о том, какие файлы заголовков требуется включать в программу. В
Linux они таковы:
#include <sys/socket.h> /* содержит прототипы функций */
#include <sys/types.h> /* содержит объявления стандартных
системных типов данных */
#include <resolv.h> /* содержит объявления дополнительных
типов данных */
В файле sys/socket.h находятся объявления функций библиотеки Socket API (включая функцию
socket(), естественно). В файле sys/types.h определены многие типы данные, используемые при работе с
сокетами.
Файлы resolv.h и sys/types.h
В примерах книги используется файл resolv.h, содержащий объявления дополнительных типов данных.
Необходимость в нем возникла, когда при тестировании примеров в системах Mandrake 6.0-7.0 оказа-
лось, что существующий файл sys/types.h некорректен (он не включает файл netinet/in.h, в котором оп-
ределены типы данных, используемые при работе с адресами). Возможно, в других версиях Unux и UNIX
этот файл исправлен.
Действие функции socket() заключается в создании очередей, предназначенных для приема и от-
правки данных. В этом ее отличие от функции ореп(), которая открывает файл и читает содержимое его
первого блока. Подключение очередей к сетевым потокам происходит только при выполнении систем-
ного вызова bind().
Если провести аналогию с телефонным звонком, то сокетэто трубка
, не подключенная ни к ба-
зовому аппарату, ни к телефонной линии. Функции bind(), connect() и некоторые функции ввода-вывода
соединяют трубку с телефоном, а телефонс линией. (Если в программе не содержится явного вызова
функции bind (), то его осуществляет операционная система; обратитесь к главе 4).
Подключение к серверу
После создания сокета необходимо подключиться к серверу. Эту задачу выполняет функция con-
nect (), действие которой напоминает звонок по телефону.
Когда вы звоните абоненту, вы набираете его номер, который идентифицирует телефонный ап-
парат, расположенный где-то в телефонной сети. Точно так же IP-адрес идентифицирует
компьютер. Как и у телефонного номера, у IP-адреса есть
определенный формат.
Соединение, телефонное или сетевое, представляет собой канал передачи сообщений. Когда че-
ловек на другом конце провода снимает трубку, соединение считается установленным. Ваш
телефонный номер не имеет значения, если только человек, с которым вы общаетесь, не захо-
чет вам перезвонить.
Номер вашего аппарата определяется внутри АТС, где происходит
направление потоков сооб-
щений, передаваемых в рамках текущего соединения. В компьютерной сети абонентский
компьютер или сервер должен в процессе соединения узнать адрес и порт, по которым можно
будет связаться с вашей программой. Вы должны сообщить свой телефонный номер людям,
которые могут вам позвонить. В случае программы, принимающей входные звонки, необхо-
димо
назначить ей канал (или порт) и сообщить о нем своим клиентам.
Синтаксис функции connect () таков:
int sd;
sd = socket(PF_INET, SOCK_STREAM, 0);
      В переменную sd будет записан дескриптор сокета, функционально эквивалентный дескриптору
файла:
int fd;
fd = open(...);
     В случае возникновения ошибки функция socket () возвращает отрицательное число и помещает
код ошибки в стандартную библиотечную переменную errno. Вот наиболее распространенные коды
ошибок.
      • EPROTONOSUPPORT. Тип протокола или указанный протокол не поддерживаются в данном
         домене. В большинстве доменов параметр protocol должен равняться нулю.
      • EACCES. Отсутствует разрешение на создание сокета указанного типа. При создании сокетов
         типа SOCK_RAW и PF_PACKET программа должна иметь привилегии пользователя root.
      • EINVAL. Неизвестный протокол либо семейство протоколов недоступно. Данная ошибка может
         возникнуть при неправильном указании параметра domain или type.
      Конечно же, следует знать о том, какие файлы заголовков требуется включать в программу. В
Linux они таковы:
#include             /* содержит прототипы функций */
#include         /* содержит объявления стандартных
                                          системных типов данных */
#include         /* содержит объявления дополнительных
                                                    типов данных */
       В файле sys/socket.h находятся объявления функций библиотеки Socket API (включая функцию
socket(), естественно). В файле sys/types.h определены многие типы данные, используемые при работе с
сокетами.
Файлы resolv.h и sys/types.h
В примерах книги используется файл resolv.h, содержащий объявления дополнительных типов данных.
Необходимость в нем возникла, когда при тестировании примеров в системах Mandrake 6.0-7.0 оказа-
лось, что существующий файл sys/types.h некорректен (он не включает файл netinet/in.h, в котором оп-
ределены типы данных, используемые при работе с адресами). Возможно, в других версиях Unux и UNIX
этот файл исправлен.
      Действие функции socket() заключается в создании очередей, предназначенных для приема и от-
правки данных. В этом ее отличие от функции ореп(), которая открывает файл и читает содержимое его
первого блока. Подключение очередей к сетевым потокам происходит только при выполнении систем-
ного вызова bind().
      Если провести аналогию с телефонным звонком, то сокет — это трубка, не подключенная ни к ба-
зовому аппарату, ни к телефонной линии. Функции bind(), connect() и некоторые функции ввода-вывода
соединяют трубку с телефоном, а телефон — с линией. (Если в программе не содержится явного вызова
функции bind (), то его осуществляет операционная система; обратитесь к главе 4).

      Подключение к серверу
        После создания сокета необходимо подключиться к серверу. Эту задачу выполняет функция con-
nect (), действие которой напоминает звонок по телефону.
      •Когда вы звоните абоненту, вы набираете его номер, который идентифицирует телефонный ап-
         парат, расположенный где-то в телефонной сети. Точно так же IP-адрес идентифицирует
         компьютер. Как и у телефонного номера, у IP-адреса есть определенный формат.
      •Соединение, телефонное или сетевое, представляет собой канал передачи сообщений. Когда че-
         ловек на другом конце провода снимает трубку, соединение считается установленным. Ваш
         телефонный номер не имеет значения, если только человек, с которым вы общаетесь, не захо-
         чет вам перезвонить.
      •Номер вашего аппарата определяется внутри АТС, где происходит направление потоков сооб-
         щений, передаваемых в рамках текущего соединения. В компьютерной сети абонентский
         компьютер или сервер должен в процессе соединения узнать адрес и порт, по которым можно
         будет связаться с вашей программой. Вы должны сообщить свой телефонный номер людям,
         которые могут вам позвонить. В случае программы, принимающей входные звонки, необхо-
         димо назначить ей канал (или порт) и сообщить о нем своим клиентам.
Синтаксис функции connect () таков: