Составители:
Рубрика:
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
- …
- следующая ›
- последняя »
