寻址方式和字节顺序
- 在socket套接字编程中,为了准确定位通信双方和数据传输的有效性、完整性、编程时必须使用统一的寻址方式和字节排列顺序
- 在TCP/IP协议通讯中,用户使用ip地址和端口号进行确认通信双方。而在其他协议中不一定也使用该方式确定通信双方。
- winsock,用户可以使用tcp/ip地址家族中统一套接字地址结构解决TCP/IP寻址中可能出现的问题,该套接字地址结构定义如下
struct sockaddr_in
{
short sin_family;//指定地址家族即地址格式
unsigned short sinport;//端口号
struct in_addr sin_addr;//ip地址
char sin_zero[8];//需要指定为0
}
- 这个结构中成员sin_family指定使用该套接字地址的地址家族,必须设置为AF_INET,表示程序使用的地址家族为TCP/IP
- 该结构的最后一个成员并未实际使用,主要是为了与第一个版本的套接字地址结构大小相同而设置,使用时直接设置为0即可
struct in_addr
{
union {
struct{
unsigned char s_b1,s_b2,s_b3,s_b4;
}S_un_b;//用四个u_char字符描述ip地址
start{
unsigned short s_w1,s_w2;
}S_un_w;//用两个u_short类型描述ip地址
unsigned long S_addr;//用一个u_long类型描述ip地址
}S_un
}
- 通常使用u_long类型的字符进行描述ip地址即可,例如使用ip地址结构in_addr进行描述ip地址“192.168.0.1”
sockaddr_in addr;
addr.sin_addr.Sun.S_addr=inet_addr("192.168.0.1")
- 首先定义sockaddr_in结构对象,ip地址结构in_addr中的成员S_addr赋值,因为结构成员S_Addr所描述的ip地址为网络字节顺序,所以调用inet_addr()函数将字符串ip转换为网络字节序顺序排列的ip地址
字节顺序转换函数
u_short htons(u_short hostshort)//将一个u_short类型的ip地址抓从主机字节顺序转换道网络字节顺序
u_long htonl(u_long hostlong)//将一个u_long类型的ip地址从主机字节序转换为网络字节序
u_long ntohl (u_long netlong)//将一个u_long类型的ip地址从网络字节序转换道主机字节序
u_long ntohs(u_short netshort)//将一个字符串ip转换到网络字节顺序排序的ip地址
unsignet long inet_addr(const char FAR * cp)//将一个字符串ip转换到网络字节序排序的ip地址
char FAR * inet_ntoa(struct in_addr in)//将一个以网络字节序排序的ip地址转换为一个字符串ip
- 以上函数与操作系统平台无关,使用这些函数编写的程序能在所有的操作系统平台中运行。