2012-01-02 2 views
0

Пример:Какова цель 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» может измениться.

ответ

3

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

+0

И он должен знать, насколько большой этот параметр, чтобы он мог извлечь содержащуюся ценность (просто да/нет для SO_REUSEADDR)? Он не собирается использовать эту память ни для чего другого? Он никогда не изменит значение iSocketOption? – Wienke

+1

@Wienke: вызовы функций в C являются передаваемыми значениями.Значение 'int' копируется в последний аргумент; 'setsockopt' может изменить свою собственную копию по своему усмотрению, но не может изменить ни одну из ваших переменных. –

+0

@Peter: значение в последнем arg - это размер памяти, на который указывает третий arg, поэтому я предполагаю, что функция может фактически изменить то, что там находится. – Wienke

2

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

setsockopt работает для установки множества различных типов значений. Хотя многие (возможно, даже самые) имеют тип int, другие - struct s разных размеров. Так как единственное, что получает setsockopt, это указатель, он не знает, насколько велика struct, и именно поэтому вам нужно это рассказать.

Некоторые примеры других типов значений, смотрите в документации GNU C на http://www.delorie.com/gnu/docs/glibc/libc_352.html

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

+0

Спасибо, Моше, за подтверждение и разработку. Тем не менее, я оставляю «правильную» проверку на ответ Роберта, так как повествование естественно идет оттуда. – Wienke