Совокупная информация об адресе, порте программы-адресата (абонента), модели соединения, протоколе взаимодействия составляет так называемый сокет (конечная абонентская точка), формально представляющий собой структуру данных. Существует несколько видов сокетов:
· обобщенный сокет (generic socket), определяется в файле <sys/socket.h>:
struct sockaddr { u_char sa_family; /* Семейство адресов (домен) */ char sa_data[]; /* Адрес сокета */ };
· сокеты для связи через сеть, определяются в файле <netinet/in.h>
struct sockaddr_in { u_char sin_len; /* Длина поля sockaddr_in (для FreeBSD) */ u_char sin_family; /* Семейство адресов (домен) */ u_short sin_port; /* Номер порта */ struct in_addr sin_addr; /* IP-адрес */ char sin_zero[8]; /* Поле выравнивания */ };
где
struct in_addr { n_int32_t s_addr };
Создается сокет при помощи системного вызова socket()
#include <sys/socket.h> int socket (int domain, int type, int protocol);
· параметр domain - домен связи, в котором будет использоваться сокет (значение AF_INET - для домена Internet (соединение через сеть), AF_UNIX - домен, если процессы находятся на одном и том же компьютере);
· параметр type определяет тип создаваемого сокета (значение SOCK_STREAM - для режима соединений, SOCK_DGRAM - для режима дейтаграмм);
· Параметр protocol определяет используемый протокол (в случае protocol=0 по умолчанию для сокета типа SOCK_STREAM будет использовать протокол TCP, а для сокета типа SOCK_DGRAM - протокол UDP).
При программировании TCP-соединения должны быть созданы сокеты (системный вызов socket()) и в программе сервера, и в программе клиента, при этом в обеих программах сокеты связываются с адресом машины, на которую будет установлена программа сервера. Но, если в программе сервера для определения IP-адреса в структуре сокета может быть использована переменная INADDR_ANY, то в программе клиента для занесения в структуру сокета IP-адреса машины сервера необходимо использовать системный вызов inet_addr().
Сетевые вызовы inet_addr() и inet_ntoa() выполняют преобразования IP-адреса из формата текстовой строки "x.y.z.t" в структуру типа in_addr и обратно.
Для того чтобы процесс мог ссылаться на адрес своего компьютера, в файле <netinet/in.h> определена переменная INADDR_ANY, содержащая локальный адрес компьютера в формате in_addr_t.