Пример:
// 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 »может измениться.