2012-03-22 19 views
6

それは関数を定義します。受け入れる関数のアドレスサイズ長

int accept (int socket, struct sockaddr *address, socklen_t *address_len); 

私の質問は、のsocklen_tをどうする*をaddress_lenましたmanualに基づいてを指します.socklen_t入力には、指定された長さが指定されたsockaddr構造体を指定し、出力には格納されたアドレスの長さを指定します。

address_lenサイズ入力は出力と異なる場合がありますか?

これは私がsockaddr_in構造のために作成したラッパーでテストケースをエミュレートするために必要です。

ありがとうございます!

+0

+1いい質問 –

+0

'sockaddr'は2番目のメンバーとして' char'配列を持っています。返された 'address_len'の値は、そのメンバで何個の要素が実際に使われているかを表しています(それに含まれる要素の数とは対照的に) – Attila

答えて

4

これ以上のことはできません(入力の長さはオーバーフローを防ぐための境界です)が、特定のソケットタイプ、たとえばアドレスが本質的にパス名であるUnixドメインソケットの場合は少なくなる可能性があります。 IP(v4またはv6)ソケットの場合、対応するsockaddr_inまたは構造の公称サイズになります。

のようないくつかのインターフェイスを使用して、どのタイプのアドレス/プロトコルファミリが関与しているのかわからないことにも注意してください。たとえば、ライブラリコードの一部として関数があり、型が不明なソケットを受け取り、sockaddr_storage構造体でacceptを呼び出します。発信者が何をしたかに応じて、IPv4アドレスとIPv6アドレス、またはまったく別のものを見つけることができます。

この使用法は、acceptではかなり一般的ではありませんが、同じインターフェイススタイルを使用するgetpeernameの方がはるかに多いでしょう。実際、これはinetdから実行され、リモートアドレスを知りたいすべてのデーモンが動作しなければならない方法です。

+0

ありがとうございました! –

関連する問題