xxxcharsa_data1414字节的协议地址sa_family一般为AF_INET,代表I
ter
et(TCPIP)地址族;sa_data则包含该socket的IP地址和端口号。另外还有一种结构类型:structsockaddr_i
shorti
tsi
_family地址族u
sig
edshorti
tsi
_port端口号
fstructi
_addrsi
_addrIP地址u
sig
edcharsi
_zero8填充0以保持与structsockaddr同样大小这个结构更方便使用。si
_zero用来将sockaddr_i
结构填充到与structsockaddr同样的长度,可以用bzero或memset函数将其置为零。指向sockaddr_i
的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向sockaddr_i
的指针转换为指向sockaddr的指针;或者相反。使用bi
d函数时,可以用下面的赋值实现自动获得本机IP地址和随机获取一个没有被占用的端口号:my_addrsi
_port0系统随机选择一个未被使用的端口号my_addrsi
_addrs_addrINADDR_ANY填入本机IP地址通过将my_addrsi
_port置为0,函数会自动为你选择一个未占用的端口来使用。同样,通过将my_addrsi
_addrs_addr置为INADDR_ANY,系统会自动填入本机IP地址。注意在使用bi
d函数是需要将si
_port和si
_addr转换成为网络字节优先顺序;而si
_addr则不需要转换。计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先。I
ter
et上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在I
ter
et上传输数据时就需要进行转换,否则就会出现数据不一致。下面是几个字节顺序转换函数:hto
l:把32位值从主机字节序转换成网络字节序hto
s:把16位值从主机字节序转换成网络字节序
tohl:把32位值从网络字节序转换成主机字节序
tohs:把16位值从网络字节序转换成主机字节序Bi
d函数在成功被调用时返回0;出现错误时返回