Какова цель аргумента setsockopt option_len? - PullRequest
0 голосов
/ 03 января 2012

Пример:

// socket created above this
int iSocketOption = 1; 
setsockopt(CFSocketGetNative(socket), SOL_SOCKET, SO_REUSEADDR, (void *)&iSocketOption, sizeof(iSocketOption));

Я понимаю, что когда вы передаете подстановочный указатель на адрес int, установленный в 1 для аргумента option_value (4-й аргумент), вы говорите: да, используйте параметр SO_REUSEADDR.

Но что происходит с option_len, последним аргументом? Похоже, идея состоит в том, чтобы перезапустить int, используемый для аргумента arg перед ним, превратив его в буфер для сообщения о размере несвязанного значения. Что это за несвязанная ценность? Должен ли я что-то делать с этим?

Вот выдержка из Руководства по системным вызовам BSD, которая меня смущает:

Для getsockopt () option_len - это параметр значения-результата, изначально содержащий размер буфера, на который указывает option_value, и изменяемый при возврате, чтобы указать фактический размер возвращаемого значения.

Каково значение, размер которого должен быть возвращен с использованием буфера, переданного через предпоследний аргумент setsockopt?

(Конечно, выдержка относится к getsockopt, а не setsockopt, но другого последнего объяснения этому объяснению нет).


Почему я задал этот вопрос:

Apress More iPhone 3 Development дает этот пример настройки сокета внутри метода, который возвращает BOOL:

- (BOOL) methodInvolvingSocket {
// socket creation
int ret = 1; 
setsockopt(CFSocketGetNative(socket), SOL_SOCKET, SO_REUSEADDR, (void *)&ret,
sizeof(ret));
//...socket address set up, but no further use of “ret.”
return ret;
}

В конце этого метода возвращение выполняется с использованием «ret» - который работает, потому что ret равен 1, что эквивалентно YES, но это довольно странная вещь, если не было некоторого ожидания, что значение « ret »может измениться.

Ответы [ 2 ]

3 голосов
/ 03 января 2012

Для setsockopt последний параметр не делает ничего, кроме как сообщает функции, как долго указатель памяти на параметр перед этим.

2 голосов
/ 22 марта 2012

Ваше предположение из комментариев другого ответа верное.

setsockopt работает для установки множества различных типов значений.Хотя многие (возможно, даже большинство) относятся к типу int, другие - struct с различными размерами.Поскольку единственное, что получает setsockopt, - это указатель, то он не может знать, насколько велик struct, и поэтому вам нужно указать его.см. документацию GNU C по адресу http://www.delorie.com/gnu/docs/glibc/libc_352.html

То же самое верно для getsockopt, только наоборот.Предполагается, что вы не знаете, насколько велик тип, поэтому он помещает размер в int, который вы ему предоставляете.Вам необходимо установить его значение равным размеру буфера, чтобы предотвратить переполнение буфера при получении значения.

...