3

以下のスニペットで、sockaddr_inがsockaddrとして'(struct sockaddr *)&sin'として型変換されていることがわかりました。sockaddr_inにある変数がsockaddrに対応してマップされるのか知りたいだけです。以下はスニペットです。

struct sockaddr {
unsigned short    sa_family;    // address family, AF_xxx
char              sa_data[14];  // 14 bytes of protocol address
};

// IPv4 AF_INETソケット:

struct sockaddr_in {
short            sin_family;   // e.g. AF_INET, AF_INET6
unsigned short   sin_port;     // e.g. htons(3490)
struct in_addr   sin_addr;     // see struct in_addr, below
char             sin_zero[8];  // zero this if you want to
};

struct sockaddr_in sin;

sin.sin_family = AF_INET;
sin.sin_port = htons(floodport);
sin.sin_addr.s_addr = inet_addr(argv[1]);

//型変換

(struct sockaddr *) &sin  // what values of sockaddr_in would be mapped to sockaddr ?

この変換は、以下のようにソケットプログラミングのsendto()で使用されます。

sendto(s, datagram, iph->tot_len,0, (struct sockaddr *) &sin,sizeof(sin))

前もって感謝します 。

4

2 に答える 2

2

唯一の目的は、などstruct sockaddrの関数に渡す型を 1 つ持つことです。sendto()

実際、他の目的には使用しません。次のような他の構造体があります。

  • struct sockaddr_in従来の IPv4 の場合
  • struct sockaddr_in6IPv6 用
  • struct sockaddr_unUnix ソケット用
  • struct sockaddr_bthブルートゥース用
  • struct sockaddr_storageこれは、アーキテクチャで最大のものと同じ大きさです。型のわからないアドレスの格納に、きれいに使えます。
于 2012-12-05T13:16:36.717 に答える
2

struct sockaddr を使用する関数は、sa_family のみを読み取り、内部で反対のキャストを行います (sa_family の内容を理解している場合)。

于 2012-12-05T13:17:12.760 に答える