о функциях setsockopt () и getsockopt () - PullRequest
5 голосов
/ 20 ноября 2010

для чего особенно используются параметры сокетов, например, setsockopt () и getsockopt () в программировании сокетов?

Ответы [ 4 ]

4 голосов
/ 20 ноября 2010

Например, вы хотите установить или узнать размер буфера приема

1)

int skt, int sndsize;
err = setsockopt(skt, SOL_SOCKET, SO_RCVBUF, (char *)&sndsize,
                                 (int)sizeof(sndsize));

err = getsockopt(skt, SOL_SOCKET, SO_RCVBUF, (char *)&sockbufsize, &size);

2) Повторно использовать адрес

 int on = 1;
 if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
2 голосов
/ 31 декабря 2013

Внешне сокеты выглядят как двунаправленный канал, что полезно, потому что стандартные системные вызовы, такие как write, read, close, могут использоваться на них так же, как на обычных каналах или даже файлах. Даже если вы добавите вызовы, специфичные для сокетов (listen, connect, bind, accept), существует полезный уровень абстракции, который скрывает детали в пользу понятия потоковых сокетов или сокетов дейтаграмм.

Но как только в протокол вступают в действие подробности протокола и настраиваются конкретные настройки (например, буферы отправки / получения, настройки тайм-аута), необходим очень общий интерфейс для учета различных настроек и их конкретных форматов данных. , getsockopt, setsockopt являются частью этого универсального интерфейса.

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

Опции протокола выбираются с помощью level и optname, а данные протокола скрываются в буфере, поэтому двум системным вызовам не нужно ничего знать о настройках каждого протокола, который может использовать ОС поддержка - достаточно, если ваше приложение и фактическая реализация протокола знают об этих деталях.

2 голосов
/ 20 ноября 2010

Как уже упоминалось, они используются для установки / получения различных опций для сокета.

Например, если вы тестируете серверное приложение, которое дает сбой, вы не будете ждать определенное количество минут, прежде чем ядро ​​позволит вам повторно использовать порт, избегая сообщений об ошибках «Адрес уже используется». Этого можно избежать, если вы используете опцию SO_REUSEADDR, позволяющую другим сокетам связываться с тем же портом, если активный прослушиватель уже не связан.

Вы также можете получить данные о сокете, такие как количество потерянных пакетов / повторных передач и т. Д., Используя TCP_INFO на машинах Linux.

В принципе, вы можете настроить все точные настройки.

Опции для setsockopt (2) и getsockopt (2) .

2 голосов
/ 20 ноября 2010

Для многих различных вещей, включая изменение размера буферов отправки и получения, длительность таймаутов, многоадресную рассылку, поддержание соединения активным, отключение алгоритма Nagel и т. Д.

Существуют уровнипараметры в зависимости от того, с каким сетевым уровнем вы взаимодействуете: сам сокет, IP, TCP и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...