现在的位置: 首页 > 综合 > 正文

vc++中 sockaddr 和sockaddr_in

2012年12月21日 ⁄ 综合 ⁄ 共 1733字 ⁄ 字号 评论关闭

struct sockaddr {
       unsigned short sa_family; /* address family, AF_xxx */
       char sa_data[14]; /* 14 bytes of protocol address */
};
sa_family 能够是各种各样的事情,但是在这篇文章中是 "AF_INET"。 sa_data 为套接口储存目标地址和端口信息。看上去很笨拙,不是吗。
为了对付 struct sockaddr,程序员创造了一个并列的结构:
struct sockaddr_in ("in" 代表 "Internet".)
struct sockaddr_in {
              short int sin_family; /* Address family */
              unsigned short int sin_port; /* Port number */
              struct in_addr sin_addr; /* Internet address */
              unsigned char sin_zero[8]; /* Same size as struct sockaddr */
};
这个数据结构让可以轻松处理套接口地址的基本元素。注意 sin_zero (他 被加入到这个结构,并且长度和 struct sockaddr 一样) 应该使用函数 bzero() 或 memset() 来全部置零。 Also, and this

is the important bit, a pointer to a struct sockaddr_in can be cast to a pointer to a struct sockaddr and vice-versa. 这样的话 即使 socket() 想要的是 struct sockaddr *, 你仍然

可以使用 struct sockaddr_in,and cast it at the last minute! 同时,注意 sin_family 和 struct sockaddr 中的 sa_family 一致并能够设置为 "AF_INET"。最后, sin_port 和 sin_addr 必须

是网络字节顺序 (Network Byte Order)!
IP 地址和如何处理他们
现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有必要用手工计算 他们,也没有必要用 << 操作符来操作 long。
首先,假设你用 struct sockaddr_in ina,你想将 IP 地址 "132.241.5.10" 储存到其中。你要用的函数是 inet_addr(),转换 numbers-and-dots 格式的 IP 地址到 unsigned long。这个工作可以这

样来做:
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
注意:inet_addr() 返回的地址已经是按照网络字节顺序的,你没有必要再去调用 htonl()。
好了,你现在可以转换字符串形式的 IP 地址为 long 了。那么你有一个数据结构 struct in_addr,该如何按照 numbers-and-dots 格式打印呢? 在这个 时候,也许你要用函数
inet_ntoa() ("ntoa" 意思是 "network to ascii"):

printf("%s",inet_ntoa(ina.sin_addr));
他将打印 IP 地址。注意的是:函数 inet_ntoa() 的参数是 struct in_addr,而不是 long。同时要注意的是他返回的是一个指向字符的指针。 在 inet_ntoa 内部的指针静态地储存字符数组,因此每

次你调用 inet_ntoa() 的时候他将覆盖以前的内容。例如:

char *a1, *a2;
a1 = inet_ntoa(ina1.sin_addr); /* this is 198.92.129.1 */
a2 = inet_ntoa(ina2.sin_addr); /* this is 132.241.5.10 */
printf("address 1: %s\n",a1);
printf("address 2: %s\n",a2);

运行结果是:
address 1: 132.241.5.10
address 2: 132.241.5.10
如果你想保存地址,那么用 strcpy() 保存到自己的字符数组中。

抱歉!评论已关闭.