Linux C中sockaddr和sockaddr_in的区别
LinuxC中sockaddr和sockaddr_in的区别
structsockaddr和structsockaddr_in这两个结构体用来处理网络通信的地址。
在各种系统调用或者函数中,只要和网络地址打交道,就得用到这两个结构体。
网络中的地址包含3个方面的属性:
1地址类型:ipv4还是ipv6
2ip地址
3端口
相应的,头文件有如下定义:
includestructsockaddr{ unsignedshortsa_family;//2bytesaddressfamily,AF_xxx charsa_data[14];//14bytesofprotocoladdress }; //IPv4AF_INETsockets: structsockaddr_in{ shortsin_family;//2bytese.g.AF_INET,AF_INET6 unsignedshortsin_port;//2bytese.g.htons(3490) structin_addrsin_addr;//4bytesseestructin_addr,below charsin_zero[8];//8byteszerothisifyouwantto }; structin_addr{ unsignedlongs_addr;//4bytesloadwithinet_pton() };
注释中标明了属性的含义及其字节大小,这两个结构体一样大,都是16个字节,而且都有family属性,不同的是:
sockaddr用其余14个字节来表示sa_data,而sockaddr_in把14个字节拆分成sin_port,sin_addr和sin_zero分别表示端口、ip地址。sin_zero用来填充字节使sockaddr_in和sockaddr保持一样大小。
sockaddr和sockaddr_in包含的数据都是一样的,但他们在使用上有区别:
程序员不应操作sockaddr,sockaddr是给操作系统用的
程序员应使用sockaddr_in来表示地址,sockaddr_in区分了地址和端口,使用更方便。
一般的用法为:
程序员把类型、ip地址、端口填充sockaddr_in结构体,然后强制转换成sockaddr,作为参数传递给系统调用函数
网络编程中一段典型的代码为:
intsockfd; structsockaddr_inservaddr; sockfd=Socket(AF_INET,SOCK_STREAM,0); /*填充structsockaddr_in*/ bzero(&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port=htons(SERV_PORT); inet_pton(AF_INET,"127.0.0.1",&servaddr.sin_addr); /*强制转换成structsockaddr*/ connect(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr));
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!