C语言中的结构类型转换

C语言中的结构类型转换,c,sockets,struct,network-programming,type-conversion,C,Sockets,Struct,Network Programming,Type Conversion,在下面的代码片段中,我发现中的一个sockaddr_被转换为sockaddr as'(struct sockaddr*)&sin'类型。我只想知道sockaddr_中的变量是什么,它们将相应地映射到sockaddr。 下面是片段 struct sockaddr { unsigned short sa_family; // address family, AF_xxx char sa_data[14]; // 14 bytes of protocol add

在下面的代码片段中,我发现中的一个sockaddr_被转换为sockaddr as'(struct sockaddr*)&sin'类型。我只想知道sockaddr_中的变量是什么,它们将相应地映射到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))

提前感谢。

struct sockaddr的唯一用途是将一种类型传递给函数,如
sendto()

事实上,你不会把它用于其他目的,比如

  • 旧式IPv4的中的结构sockaddr\u
  • 用于IPv6的结构sockaddr\u in6
  • Unix套接字的结构sockaddr\u un
  • struct sockaddr\u bth
    用于蓝牙
  • struct sockaddr\u存储
    ,它与您计算机中最大的存储一样大 建筑学可以整齐地用于存储您输入的地址类型 不知道

使用struct sockaddr的函数只会读取sa_族,并在内部执行相反的强制转换(如果它们了解sa_族内部的内容)。

那么,您的问题是什么?