【问题标题】:struct type conversion in CC中的结构类型转换
【发布时间】:2012-11-23 07:44:20
【问题描述】:

在下面的 sn-p 中,我发现 sockaddr_in 被类型转换为 sockaddr as '(struct sockaddr *) &sin' 。我只想知道 sockaddr_in 中的变量将对应映射到 sockaddr 。 下面是sn-p。

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

提前致谢。

【问题讨论】:

  • 那么,您的问题到底是什么?

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


【解决方案1】:

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

其实你并没有把它用于其他用途,那里有other structs之类的

  • 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 内部的内容)。

    【讨论】:

      猜你喜欢
      • 2021-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      相关资源
      最近更新 更多