logo
Конспект Граур

Функция создания сокета

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 необходимо, чтобы такого файла не существовало к данному моменту. Это следует учитывать, если мы «зашиваем» в программу определенное имя и намерены запускать нашу программу несколько раз – необходимо удалять этот файл перед связыванием. Также должно быть достаточно прав доступа, иначе может не установиться связь.

Различают сокеты с предварительным установлением соединения, когда до начала передачи данных устанавливаются адреса сокетов отправителя и получателя данных – сокеты соединяются друг с другом и остаются соединенными до окончания обмена данными и сокеты без установления соединения, когда соединение до начала передачи данных не устанавливается, а адреса сокетов отправителя и получателя передаются с каждым сообщением. Если тип сокета –виртуальный канал, то сокет должен устанавливать соединение, если же тип сокета – датаграмма, то, как правило, это сокет без установления соединения, хотя последнее не является требованием