C中的结构类型转换

时间:2012-12-05 13:09:07

标签: c sockets struct network-programming type-conversion

在下面的代码片段中,我发现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))

提前致谢。

2 个答案:

答案 0 :(得分:2)

struct sockaddr的唯一目的是让一种类型传递给sendto()等函数。

事实上,你没有将它用于其他目的,你有other structs,例如

  • struct sockaddr_in用于旧版IPv4
  • struct sockaddr_in6 for IPv6
  • struct sockaddr_un用于Unix套接字
  • struct sockaddr_bth用于蓝牙
  • struct sockaddr_storage,与您最大的一样大 建筑。可以巧妙地用于存储您的类型的地址 不知道。

答案 1 :(得分:2)

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