socket()
Функция создания сокета так и называется – socket()
#include <sys/types.h>
#include <sys/socket.h>
int socket (int domain, int type, int protocol);
domain – коммуникационный домен, к которому должен принадлежать создаваемый сокет
AF_UNIX
AF_INET
type – тип соединения, которым будет пользоваться сокет (тип сокета)
SOCK_STREAM виртуальный канал
SOCK_DGRAM датаграммы
protocol –протокол, который будет использоваться в рамках данного коммуникационного домена для создания соединения.
Если установить значение данного аргумента в 0, система автоматически выберет подходящий протокол.
Константы для протокола AF_INET:
IPPROTO_TCP – обозначает протокол TCP (корректно при создании сокета типа SOCK_STREAM)
IPPROTO_UDP – обозначает протокол UDP(корректно при создании сокета типа SOCK_DGRAM)
В случае успеха функция возвращает положительное целое число – дескриптор сокета (аналог файлового дескриптора). В случае неудачи (например, при некорректном сочетании коммуникационного домена, типа сокета и протокола), функция возвращает –1.
Связывание
|
|
bind()
Связывание
#include <sys/types.h>
#include <sys/socket.h>
int bind (int sockfd, struct sockaddr *myaddr, int addrlen);
sockfd – дескриптор сокета
myaddr – указатель на структуру, содержащую адрес сокета
Для домена AF_UNIX формат структуры описан в <sys/un.h>.
#include <sys/un.h>
struct sockaddr_un {
short sun_family; /* == AF_UNIX */
char sun_path[108];
};
Для домена AF_INET формат структуры описан в <netinet/in.h>
#include <netinet/in.h>
struct sockaddr_in {
short sin_family; /* == AF_INET */
u_short sin_port; /* port number */
struct in_addr sin_addr; /* host IP address */
char sin_zero[8]; /* not used */
};
addrlen – последний аргумент функции задает реальный размер структуры, на которую указывает myaddr.
В случае успешного связывания bind возвращает 0, в случае ошибки – -1.
Если мы имеем дело с локальными сокетами и адрес сокета представляет собой имя файла, то при выполнении функции bind система в качестве побочного эффекта создает файл с таким именем. Поэтому для успешного выполнения bind необходимо, чтобы такого файла не существовало к данному моменту. Это следует учитывать, если мы «зашиваем» в программу определенное имя и намерены запускать нашу программу несколько раз – необходимо удалять этот файл перед связыванием. Также должно быть достаточно прав доступа, иначе может не установиться связь.
Различают сокеты с предварительным установлением соединения, когда до начала передачи данных устанавливаются адреса сокетов отправителя и получателя данных – сокеты соединяются друг с другом и остаются соединенными до окончания обмена данными и сокеты без установления соединения, когда соединение до начала передачи данных не устанавливается, а адреса сокетов отправителя и получателя передаются с каждым сообщением. Если тип сокета –виртуальный канал, то сокет должен устанавливать соединение, если же тип сокета – датаграмма, то, как правило, это сокет без установления соединения, хотя последнее не является требованием