Теория и практика программирования на Си в Unix

       

Основные примитивы


Создание сокета
int socket (домен, тип, протокол)
int domain; /*AF_UNIX или AF_INET*/
int type; /*SOCK_STREAM или SOCK_DGRAM*/
int protocole; /*поставить ноль*/

Примитив возвращает используемый сокет-дескриптор для следующих вызовов.
- Binding (связывание)
int bind (sock, localaddr, addrlen)
int sock;/*сокет-дескриптор*/
struct sockaddr *localaddr; /*локальный сокет-адрес*/
int addrlen; /*длина адреса*/

Данный вызов позволяет связать локальный адрес с сокет-дескриптором, создаваемым socket (). Эта операция является необязательной для клиентов, использующих сокет с установлением логического (виртуального) соединения, так как адрес присваивается в момент соединения с сервером в случае, если связыва-ние не произошло. Для сокетов в режиме дейтаграмм, эта операция является необходимой только в случае, если процесс должен получить данные. Для сокетов TCP/IP возможно присвоение номеру порта нулевого значения. Система присваивает номер, который можно получить посредством примитива getsockname ().

- Соединение клиента c сервером

int connect (sock, servaddr, addrlen)
int sock; /*сокет-дескриптор*/
struct sockaddr *servaddr; /*адрес сервера*/
int addrlen; /*длина адреса*/

- установка сервера в режим "прослушивания"
int listen (sock, qlen)
int sock; /*сокет-дескриптор*/
int qlen; /*макс. число необработ. подсоединений*/
Этот примитив указывает, что сервер готов к получению запросов на соединение. Параметр qlen указывает на максимальное число запросов, которое может быть установлено в режим ожидания обработки.
- Согласие сервера на соединение
int accept (sock, addrdistant, addrlen)
int sock; /*сокет-дескриптор*/
struct sockaddr *addrdistant; /*адрес телекоммуник.*/
int *addrlen; /*длина адреса*/

Этот вызов используется сервером для ожидания запросов клиентов. Два последних параметра могут быть установлены в 0, кроме случаев, когда необходимо проверить идентичность клиента. Благодаря этому примитиву сервер дает клиенту понять, что его запрос принят. Примитив accept () возвращает новый сокет-дескриптор, который будет использован для обмена данными с клиентом. Для сервера имеется возможность создания порожденного процесса, кото-рый воспользуется вновь созданным дескриптором, в то время как порождающий процесс вновь перейдет в состояние ожидания соединения (accept ()) на сокете, открытом функцией socket ().
- Примитивы считывания и записи read(), write(), send(), recv(), sendto(), recvfrom()
Вызовы read () и write () используются также, как и для дескриптора файла. Вызовы send () и recv () имеют дополнительный аргумент, позволяющий, кроме всего прочего, посылать экспресс-данные. Вызовы send to () и recv from () используются для сокетов типа SOCK_DGRAM. Два дополнительных параметра позволяют уточ-нить адрес удаленного компьютера в случае sendto() и восстановить этот адрес в случае recvfrom().
- Закрытие соединения int close (sock) int sock; /*сокет-дескриптор*/ Перед закрытием ядро пытается переслать еще не посланные данные.



Функции подразделяются на три группы:
- функции локального управления; они позволяют пользователю транспортной службы получить или освободить точку доступа этой службы, связать адрес с точкой доступа этой службы или выполнить обратную операцию, выделить или освободить область памяти, просмотреть или изменить состояние точки доступа транспортной службы;
- функции в режиме виртуального соединения: они позволяют организовать соединение и вести обмен данными через это соединение;
- функции в режиме отсутствия соединения: они позволяют вести обмен данными без соединения.



Содержание раздела