2012-01-02 4 views
0

例:setsockoptのoption_len引数の目的は何ですか?

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

私はあなたがoption_valueの引数(第4引数)のための1にint型のセットのアドレスにワイルドカードポインタを渡すとき、あなたが言っている、はい、SO_REUSEADDRオプションを使用することを理解しています。

しかし、最後の引数であるoption_lenでは何が起こっていますか?そのアイデアは、argの前に使用されているintをリサイクルして、無関係な値のサイズを報告するためのバッファにするように思われます。その無関係な価値は何ですか?私はそれで何かをしなければならないのでしょうか?最初にバッファのサイズを含むことoption_valueで指され、修正、)(getsockoptのため

、option_len値-結果パラメータである:ここで

は、BSDシステムからの抜粋が私を混乱の取扱説明書を呼び出します戻ったときに返される値の実際のサイズを示します。

setsockoptの最後から2番目の引数で渡されたバッファを使用してサイズを返す値は何ですか?

は(確かに、抜粋のgetsockoptについて、SETSOCKOPTないが、その最後の引数の他の説明はありません。)


私はこの質問をした理由:

プレスカンファレンスの詳細iPhone 3開発はこれを提供しますソケットの設定の例は、BOOL返すメソッドの内側 - WORこの方法の終わり

- (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

そして、それは含まれている値を抽出できるように、そのparamの大きさを知る必要があります(SO_REUSEADDRの場合はyes/no)?その記憶を他のものに使うつもりはないのですか? iSocketOptionの価値を変えることはありませんか? – Wienke

+1

@Wienke:Cでの関数呼び出しは、値渡しです。'int'値は最後の引数にコピーされます。 'setsockopt'は自由に独自のコピーを変更できますが、あなたの変数を変更することはできません。 –

+0

@Peter:最後のargの値は、3番目のargが指すメモリのサイズです。したがって、関数が実際にそこに存在するものを変更できると仮定しています。 – Wienke

2

他の回答のコメントからのあなたの推測は正しいです。

setsockoptは、さまざまな種類の値を設定できます。多くの(場合によってはさらに)ほとんどのタイプはintですが、その他はさまざまなサイズのstructです。 setsockoptが取得する唯一のものはポインタなので、structの大きさを知る方法がないため、それを伝える必要があります。値の他のタイプのいくつかの例について

http://www.delorie.com/gnu/docs/glibc/libc_352.html

でGNU Cのマニュアルを参照して同じではgetsockopt、周りの唯一の他の方法についても同様です。それはあなたがそれがあなたがそれを提供するintにサイズを置くので、タイプがどれくらい大きいか知らないと仮定します。値を取得したときにバッファのオーバーフローを防ぐために、その値をバッファのサイズに設定する必要があります。

+0

ありがとう、Moshe、確認し、精巧に。私はロバートの答えに「正しい」チェックを残しておきますが、そこから物語が自然に進行するためです。 – Wienke

関連する問題