C中的结构体类型转换

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

感谢您的提前帮助。

1
你的问题是什么? - wildplasser
2个回答

2
struct sockaddr的唯一目的是用于像sendto()等函数中传递类型。实际上,你不会将其用于其他目的,因为你可以使用其他结构体,比如:
  • struct sockaddr_in 用于遗留的IPv4
  • struct sockaddr_in6 用于IPv6
  • struct sockaddr_un 用于Unix套接字
  • struct sockaddr_bth 用于蓝牙
  • struct sockaddr_storage 的大小与架构中最大的相同。可用于存储类型未知的地址。

2

使用struct sockaddr的函数只会读取sa_family并在内部执行相反的转换(如果它们理解sa_family中的内容)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接