next up previous contents
Next: Соединение сокетов. Up: Сокеты. Previous: Общие сведения о сокетах.   Contents

Создание и именование сокета.

Для создания сокета определенного типа в определенном адресном пространстве используется функция socket():

#include <sys/ types. h>

#include <sys/ socket. h>

int socket(int domain, int type, int protocol);

Если протокол не определен, система сама определяет протокол по умолчанию, который поддерживает указанный тип сокета. Функция возвращает дескриптор сокета. Адресное пространство domain обычно принимает значения AF_UNIX или AF_INET, а тип сокета - SOCK_STREAM или SOCK_DGRAM. Если сокет не может быть создан, то функция вернет -1.

Тем не менее, удаленный процесс не может идентифицировать определенный сокет, пока ему не будет присвоен адрес. Процессы могут поддерживать связь только через адреса. В пространстве адресов UNIX соединение обычно определяется одним или двумя именами файлов. В пространстве адресов Интернета соединение определяется локальным и удаленным адресами и номерами портов.

Функция bind()

#include <sys/ types. h>

#include <sys/ socket. h>

int bind(int s, const struct sockaddr *name, int namelen);

осуществляет привязку пути к файлу или адреса Интернета к сокету. Первым аргументом является дескриптор соответствующего сокета, полученный ранее с помощью socket(). Вторым аргументом является структура, представляющая собой адрес. Она имеет вид:

struct sockaddr {

  ushort_ t sa_ family; /* семейство адресов */

  char sa_ data[ 14]; /* 14 байт прямого адреса */

};

Различные варианты сокетов могут использовать различные структуры для адреса. Например, UNIX-сокет можно описать с помощью структуры:

struct sockaddr_un {

  ushort_ t sun_ family; /* AF_ UNIX */

  char sun_ path[ 104]; /* путь к файлу */

};

Для сокета в пространстве адресов Интернет используется структура:

struct sockaddr_ in {

  uchar_ t sin_ len;

  sa_ family_ t sin_ family; /* AF_ INET */ 

  in_ port_ t sin_ port; /* 16-битный порт */

  struct in_ addr sin_ addr; /* Указатель на адрес */

  uchar_ t sin_ zero[ 8]; /* зарезервировано */ 

};



2003-12-09