sockaddr
をsockaddr_in
にキャストすることがなぜ有用か分かりますが、これはどういうことが可能か分かりません。私が読んだところでは、彼らは同じサイズで、同じサイズにするためにがsin_zero
で追加されています。コンパイラがsockaddr_in
から情報を取得する場所を、sockaddr
に別の方法でレイアウトしているかどうかをどのように知っているか知りたいと思います。なぜ私たちはsockaddr_inにsockaddrをキャストできるのですか
14
A
答えて
16
通常は構造体そのものではなく、ポインタをキャストすることが可能です。あなたは自然言語で "このポインタをへのポインタとしてsocket structure
に代用してください"という意味です。コンパイラはポインタを再解釈するのに何の問題もありません。ここ
コメントから取り、より詳細に説明する。
sockaddr
のサイズは16バイトである - 最初の2つのバイトはsa_family
であり、残りの14のバイトは、任意のデータであるsa_data
です。 sockaddr_in
も16バイトです。最初の2バイトはsin_family
(常にAF_INET
)、次の2バイトはsin_port
、次の4バイトはsin_addr
(IPアドレス)、最後の8バイトはsin_zero
です。 IPv4では未使用であり、16バイトを保証するためだけに提供されます。この方法では、最初にsockaddr.sa_family
を見ることができ、AF_INET
の場合は、sockaddr
の全体をsockaddr_in
と解釈します。
sockaddr_in
は、sockaddr.sa_data
フィールドの内部に格納されません。 sockaddr
全体がsockaddr_in
(sockaddr.sa_family
がAF_INET
の場合)です。あなたがsockaddr*
ポインタを取り、その後、sockaddr_in*
ポインタにキャストした場合:
sockaddr.sa_family
がsockaddr_in.sin_family
- バイトである
sockaddr.sa_data
の0-1は2-5であるsockaddr_in.sin_port
- バイト
sockaddr_in.sin_addr
- バイト6 -13は、
sockaddr_in.sin_zero
です。
関連する問題
- 1. 私たちはなぜ好きですか? 〜に?オペレータはC#で?
- 2. RandomAccessFileをInputstreamにキャストできないのはなぜですか?
- 3. kafka.cluster.BrokerEndPointをkafka.cluster.Brokerにキャストできないのはなぜですか?
- 4. 私たちはなぜ必要なのですか?
- 5. なぜ私はストーリーボード内の私のviewcontrollerサブクラスにキャストできませんか?
- 6. なぜ私はすぐに私のprepareForSegueメソッドで送信者をキャストできないのですか?
- 7. なぜ私たちは.htaccessがworpdressに必要ですか?
- 8. なぜorg.apache.hadoop.io.Writableをorg.apache.hadoop.io.IntWritableにキャストできないのですか?
- 9. なぜこのキャストはできないのですか?
- 10. はなぜ急に私たちのアプレット
- 11. なぜ私たちは:: {}をjava loggerで使用するのですか
- 12. 通知でAnyObjectに配列をキャストできないのはなぜですか?
- 13. なぜ私たちはクラスの体で課題を作ることができないのですか?
- 14. Python - なぜ私たちは模擬テストを行うべきですか?
- 15. なぜmyViewHolderをキャストできないのですか?
- 16. NSDictionaryのvalueForKeyメソッドをNSStringにキャストできないのはなぜですか?
- 17. なぜMac上でVisual Basicアプリケーションを実行できないのですか?私たちは、Mac OSでのVB6アプリケーションを実行できないのはなぜ
- 18. キャストせずにベースクラスのメンバーにアクセスできないのはなぜですか?
- 19. `this`をジェネリック型にキャストできないのはなぜですか?
- 20. JSONをテストしてdatetimeにキャストできないのはなぜですか?
- 21. ジェネリック型を値型にキャストできないのはなぜですか?
- 22. 文字列に整数をキャストできないのはなぜですか?
- 23. [PSSession]に関数のパラメータを宣言するためにキャストできないのはなぜですか?
- 24. asp.net mvc3、なぜ私たちは、リポジトリパターンを使用するときにサービスレイヤーが必要なのですか?
- 25. は、なぜ私たちは空の配列を作成するときに
- 26. なぜ私たちはJavaScriptを必要とするのですか?
- 27. なぜcatchブロックの...(3点)が存在するのですか?私たちにできるのtry catch文で
- 28. lambdaをvoid *をキャストして関数ポインタにキャストできないのはなぜですか?
- 29. なぜキャストできないのですか?
- 30. は、なぜ私たちは、ランタイム
sockaddrにアドレスを格納することになっている変数がchar [14]であるsa_dataなので、sockaddr_inはunsigned shortを使用するため、奇妙に見えます。私は、コンパイラがchar [14]から最初の符号なしの短いバイト数を読み込み、それをアドレスにし、残りのchar [14]が送信されるデータであると仮定していますか? また、2つの構造体のサイズを加算すると、同じサイズではありません。 sin_zeroは大きすぎるようです。私はちょうどここに起こっているものを取得するつもりです! –
'sockaddr'のサイズは16バイトです。最初の2バイトは' sa_family'で、残りの14バイトは任意のデータである 'sa_data'です。 'sockaddr_in'も16バイトのサイズです - 最初の2バイトは' sin_family '(常に' AF_INET')、次の2バイトは 'sin_port'、次の4バイトは' sin_addr'(IPアドレス)最後の8バイトは 'sin_zero'であり、これはIPv4では未使用であり、16バイトを保証するためだけに提供されています。このようにして、 'sockaddr.sa_family'を最初に見ることができ、' AF_INET'なら 'sockaddr'を' sockaddr_in'として解釈します。 –
'sockaddr_in'は' sockaddr.sa_data'フィールドの中には格納されていません。 'sockaddr' **は**' sockaddr_in'( 'sockaddr.sa_family'が' AF_INET'です。)です。 'sockaddr *ポインタを' sockaddr_in * 'ポインタにキャストすると、' sockaddr.sa_family'は 'sockaddr_in.sin_family'、' sockaddr.sa_data'のバイト0-1は 'sockaddr_in.sin_port'バイト2-5は 'sockaddr_in.sin_addr'で、バイト6-13は' sockaddr_in.sin_zero'です。 –