Составители:
Рубрика:
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 () таков:
Страницы
- « первая
- ‹ предыдущая
- …
- 4
- 5
- 6
- 7
- 8
- …
- следующая ›
- последняя »