ТОР 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: позволяет повторно использовать уже занятый сокет-адрес (речь идет прежде всего о номере порта). После установки такой опции попытка связывания сокета даже с занятым портом завершится успешно, и на наш сокет будет перенаправлен весь поток пакетов, поступающий на этот порт. Связанный же ранее с этим портом сервер перестанет получать информацию. Такой прием может быть использован, в частности, для быстрого перезапуска сервера. Запущенный таким образом процесс-сервер принимает на себя все новые соединения, а старый – постепенно завершает работу с уже установленными. Не нашли, что искали? Воспользуйтесь поиском:
|