socket学习: sockAddr_t 结构

来源:互联网 发布:中信证券行情软件 编辑:程序博客网 时间:2024/06/04 19:27
short int sin_family;   
unsigned short int sin_port;   
truct in_addr sin_addr;  
unsigned char sin_zero[8];

sin_family指代协议族,在socket编程中只能是AF_INET   sin_port存储端口号(使用网络字节顺序)  sin_addr存储IP地址,使用in_addr这个数据结构  sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。  s_addr按照网络字节顺序存储IP地址

sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向  sockaddr的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,




 将IP地址转换成长整型:首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地址"132.241.5.10"要储存在其中,你就要用到函数inet_addr(),将IP地址从点数格式转换成无符号长整型。使用方法如下:ina.sin_addr.s_addr= inet_addr("132.241.5.10");
              注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用函数htonl()。
              我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符号数)-1仅仅和IP地址255.255.255.255相符合!但这可是广播地址!所以,记住要先进行错误检查。
              怎样将一个in_addr结构体输出成点数格式?你要用到函数 inet_ntoa()("ntoa"的含义是"network toascii"),就像这样:printf("%s",inet_ntoa(ina.sin_addr));它将输出IP地址。需要注意的是inet_ntoa()将结构体in_addr作为一个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用inet_ntoa(),它就将覆盖上次调用时所得的IP地址。例如:
              char *a1, *a2;
              .
              .
              a1 = inet_ntoa(ina1.sin_addr);
              a2 = inet_ntoa(ina2.sin_addr);
              printf("address 1: %s ",a1);
              printf("address 2: %s ",a2);
              输出如下:
              address 1: 132.241.5.10
              address 2: 132.241.5.10
              假如你需要保存这个IP地址,使用strcopy()函数来指向你自己的字符指针。
              inet_ntoa()
              简述:
              将网络地址转换成“.”点隔的字符串格式
            */    
                                                     
           

原创粉丝点击