Пример:Какова цель option_len args setsockopt?
// socket created above this
int iSocketOption = 1;
setsockopt(CFSocketGetNative(socket), SOL_SOCKET, SO_REUSEADDR, (void *)&iSocketOption, sizeof(iSocketOption));
Я понимаю, что когда вы передаете подстановочные указатель на адрес в ИНТ набора 1 для значение_опции Arg (четвёртая Arg), вы говорите, да, используйте опцию SO_REUSEADDR.
Но что происходит с option_len, последним arg? Представляется, что идея состоит в том, чтобы перерабатывать int, используемый для arg, перед тем, как это сделать, превращая его в буфер для сообщения о размере несвязанного значения. Что это за несвязанная ценность? Должен ли я что-то делать с этим?
Вот выдержка из BSD системы вызовов Руководство, которая мне запутанным:
Для getsockopt(), option_len является значение параметра, результат, первоначально содержащий размер буфера, на который указывает OPTION_VALUE и модифицирована по возврату, чтобы указать фактический размер возвращаемого значения.
Какое значение должно быть возвращено с использованием буфера, переданного через предпоследний аргумент setsockopt?
(Конечно, отрывок касается getsockopt, не setsockopt, но нет никакого другого объяснения этого последнего арг.)
Почему я задал этот вопрос:
Больше iPhone 3 Development Apress дает это пример установки гнезда, внутри метода, который возвращает 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» - который прист ks, потому что ret равен 1, эквивалент YES, но это довольно странная вещь, если не ожидалось, что значение «ret» может измениться.
И он должен знать, насколько большой этот параметр, чтобы он мог извлечь содержащуюся ценность (просто да/нет для SO_REUSEADDR)? Он не собирается использовать эту память ни для чего другого? Он никогда не изменит значение iSocketOption? – Wienke
@Wienke: вызовы функций в C являются передаваемыми значениями.Значение 'int' копируется в последний аргумент; 'setsockopt' может изменить свою собственную копию по своему усмотрению, но не может изменить ни одну из ваших переменных. –
@Peter: значение в последнем arg - это размер памяти, на который указывает третий arg, поэтому я предполагаю, что функция может фактически изменить то, что там находится. – Wienke