LINUX.ORG.RU

что значит параметр optval у функции setsockopt

 optval, setsockopt


0

1

В гугл с именно таким и многими похожими запросами я обращался. И маны читал, и на русском и на буржуйском.

Но вот такое описание

Параметры optval и optlen используются в функции setsockopt для доступа к значениям флагов.
ну ни фига не понятно. Во всех интернетах вижу одно и тоже
const int n=1;
 setsockopt(..., ..., ..., n, sizeof(n)). 

что единица ? зачем единица ? такое чувство что просто просто 1 и все. И другого быть не может. Но я видел код где и 5 передавали...

На http://www.rsdn.ru/article/net/keep_alive.xml всетаки удалось найти чуть больше информации

Для включения/выключения посылки keep-alive используется опция SO_KEEPALIVE уровня SOL_SOCKET. Параметр optval интерпретируется функцией как булево значение, для включения посылки он должен иметь значение TRUE, иначе – FALSE.
А для всех остальных опций ? Вопрос какого хера bool'ево значение передается таким неепическим способом я не задаю, догадываюсь что для разных опций этот указатель и на структуру может указывать.

Подскажите пожалуйста.


Во всех интернетах

Забудь про это вообще.

И маны читал

Вот это читал?

setsockopt(2)

For a description of the available socket options see socket(7) and the appropriate protocol man pages.

JackYF ★★★★
()

Во всех интернетах

Ну в man setsockopt же всё написано английским по белому:

setsockopt() manipulate options for the socket

The arguments optval and optlen are used to access option values

Optname and any specified options are passed uninterpreted to the appropriate protocol module for interpretation.

Most socket-level options utilize an int argument for optval. For setsockopt(), the argument should be nonzero to enable a boolean option, or zero if the option is to be disabled.

For a description of the available socket options see socket(7) and the appropriate protocol man pages.

Что как бы говорит нам, что setsockopt манипулирует опциями. Устанавливаемая опция определяется из переменной optname и, в зависимости от переданных аргументов, тройка optname, optval и optlen передаётся соответствующей функции обработчику. Поскольку разные опции имеют разные типы (булевы, строковые, etc) — optval передаётся как ссылка без указания типа.

Кроме того по тексту сразу видно, что использование «int n=1; setsockopt(..., optname, &n, sizeof(n))» значит, что optname опция булева и устанавливается в true (В ANSI C нету типа bool, из-за чего используется int).

И конечно же в мане сразу видно, что существующие опции и типы их аргументов надо смотреть в man 7 socket и манах соответствующего протокола (например man 7 tcp).

Вот пример опции из socket(7):

SO_KEEPALIVE
Enable sending of keep-alive messages on connection-oriented sockets. Expects an integer boolean flag.

Тут видно, что надо использовать в качестве optval ссылку на целочисленную переменную со значением 0 или 1.

SO_LINGER
Sets or gets the SO_LINGER option. The argument is a linger structure.

Здесь видно, что если optname==SO_LINGER, то optval должен быть ссылкой на struct linger.

kim-roader ★★
()
Ответ на: комментарий от kim-roader

Most socket-level options utilize an int argument for optval. For setsockopt(), the argument should be nonzero to enable a boolean option, or zero if the option is to be disabled.

а вот это то я как раз и проглядел.

Вот например отседова socket(7) http://linux.die.net/man/7/socket я нифига не понял что речь про optval. Дошло это только после листания книжки по сетевой разработке, где в примере была использована какая то опция, уже и не помню какая, которая не указана по ссылке выше, и только найдя где то на сайте ibm полный перечень этих опций и сравнив описанную там структуру с тем что передавалось в качестве Optval до меня дошло нафига эта опция.

а вы тут про

Кроме того по тексту сразу видно

ничего там по тексту не видно, если функция эта не знакома.

SO_KEEPALIVE
Enable sending of keep-alive messages on connection-oriented sockets. Expects an integer boolean flag.

аха, ну теперь то понятно :)

Спасибо, всем за помощь.

anonymous
()
Ответ на: комментарий от anonymous

ничего там по тексту не видно, если функция эта не знакома.

Никогда в жизни не использовал эту функцию. Ман открыл только для того чтобы ответить в эту тему. Понял принцип работы практически сразу.

Спасибо, всем за помощь.

Пожалуйста.

kim-roader ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.