3

在下面的代码片段中,我发现 sockaddr_in 类型转换为 sockaddr as '(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 ?

这种转换在 socket 编程中的 sendto() 中使用,如下所示。

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

提前致谢 。

4

2 回答 2

2

for 的唯一目的struct sockaddr是让一种类型传递给诸如sendto()etc之类的函数。

实际上,您不会将其用于其他目的,您还有其他结构,例如

  • struct sockaddr_in对于旧版 IPv4
  • struct sockaddr_in6对于 IPv6
  • struct sockaddr_un用于 Unix 套接字
  • 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 回答