Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






U_short ntohs (u_short netshort;




 

hostlong – длинное целое в локальном формате;

hostshort – короткое целое в локальном формате;

netlong - длинное целое в сетевом формате;

netshort - короткое целое в сетевом формате;

 

Для имен функций используется следующая мнемоника:

· hton – host to net;

· ntoh – net to host;

· l – long int;

· s – short int;

 

При задании IP-адресов также возникают проблемы. Человек обычно задает этот адрес в виде 4-х десятичных значений составляющих его октетов (dotted decimal notation), а в структуре сокет-адреса требуется указать его в формате 32-битного целого (структура типа in_addr). Для взаимного преобразования адресов (символьная строка с общепринятой записью адреса и целое число) служит пара функций:

 

#include <sys/types.h>

#include <netinet/in.h>

#include <arpa/inet.h>

u_long inet_addr(char* address);

char* inet_ntoa(struct in_addr inadress;);

 

address – IP-адрес в виде символьной строки;

inadress - IP-адрес в формате структуры;

 

Первая функция возвращает IP-адрес в форате целого числа, вторая - IP-адрес в виде символьной строки. Мнемоника названия последней: ntoa – numeric to ASCII.

Существуют также функции, позволяющие сконструировать сокет-адрес, используя доменные имена. Один из примитивов позволяет извлечь из файла /etc/services номер порта, выделенный сервису, который реализует выполняющийся процесс-сервер и тем самым отказаться от жесткого задания номера порта в тексте программы:

 

#include <netdb.h>

struct servent* getservbyname(char* servname, char* protoname);

 

servname – имя сервиса;

protoname – имя транспортного протокола (TCP или UDP);

 

Функция возвращает указатель на структуру типа servent, в которой помещается искомая информация:

 

struct servent {

char* s_name; /*имя сервиса*/

char** s_aliases; /*список его псевдонимов*/

int s_port; /*номер порта*/

char *s_proto; /*используемый протокол*/

};

 

Адрес, связанный с сокетом, можно получить с помощью следующей функции:

 

i nt getsockname (int sock,struct sockaddr* address,int* addrlen);

 

sock – сокет-дескриптор;

*address – адрес структуры, в которую помещается искомый сокет-адрес;

*addrlen – адрес целой переменной, в которую помещается длина сокет-адреса;

 

Этот примитив позволяет, в частности, получить автоматически присвоенный адрес.

 

Параметры сокета

 

Сокеты имеют целый ряд параметров, определяющих особенности их работы. Эти параметры задаются для различных уровней стека протоколов. Текущие значения параметров можно определить с помощью примитива getsockopt():

 

int getsockopt(int socket, int level, int optname, void* optval, socklen_t* optlen);

 

sock – сокет-дескриптор;

level – уровень параметра;

optname – имя параметра;

*optval – адрес переменной, в которую помещается значение параметра;

*optlen - адрес переменной, в которую помещается длина параметра;

 

Уровень задается либо в виде константы SOL_SOCKET для определения параметров собственно сокета, либо указывается целочисленный идентификатор протокола, для которого определяется параметр.

 

Устанавливаются параметры сокета примитивом setsockopt():

 

int setsockopt(int socket, int level, int optname, const void *optval, socklen_t optlen);

 

Для установки некоторых параметров можно использовать также функции fcntl() или ioctl().

Наиболее интересными параметрами являются:

· TCP_NODELAY: устанавливает необходимость сброса буферов TCP (и посылки в сеть сформированного сегмента) после выполнения каждой операции записи.

· SO_RCVBUF и SO_SNDBUF: задают размер буферов TCP для чтения и записи соответственно. Варьируя размерами буферов, можно в каких-то пределах изменять производительность.

· SO_KEEPALIVE: организуется периодическая передача очень коротких контрольных сообщений в режиме потоковых сокетов. Блокирует срабатывание таймаута TCP и позволяет длительное время поддерживать соединение;

· SO_REUSEADDR: позволяет повторно использовать уже занятый сокет-адрес (речь идет прежде всего о номере порта). После установки такой опции попытка связывания сокета даже с занятым портом завершится успешно, и на наш сокет будет перенаправлен весь поток пакетов, поступающий на этот порт. Связанный же ранее с этим портом сервер перестанет получать информацию. Такой прием может быть использован, в частности, для быстрого перезапуска сервера. Запущенный таким образом процесс-сервер принимает на себя все новые соединения, а старый – постепенно завершает работу с уже установленными.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных