Внешне сокеты выглядят как двунаправленный канал, что полезно, потому что стандартные системные вызовы, такие как 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
, а данные протокола скрываются в буфере, поэтому двум системным вызовам не нужно ничего знать о настройках каждого протокола, который может использовать ОС поддержка - достаточно, если ваше приложение и фактическая реализация протокола знают об этих деталях.