结构
sockaddr
sockaddr_in
in_addr
函数
inet_ntoa
inet_addr
htons
htonl
ntohs
ntohl
struct sockaddr
{
u_short sa_family;
char sa_data[14];
};
sockaddr是通用IP地址的结构,sa_data中的数据含义要看sa_family说明的协议类型是什么,
sockaddr的内容是网络字节顺序(big-endian)
struct sockaddr_in
{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin_family在sockaddr可以转换成sockaddr_in来用,端点地址,必须是AF_INET。
在sockaddr的sin_addr是一个in_addr结构,来说明ip地址,
struct in_addr
{
union
{
struct{u_char s_b1,s_b2, s_b3, s_b4;} S_un_b;
struct{ u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
}S_un;
};
S_un_b Address of the host formatted as four u_chars .
S_un_w Address of the host formatted as two u_shorts .
S_addr Address of the host formatted as u_long
使用函数 char FAR* inet_ntoa (struct in_addr in); 可以将in_addr结构的地址装为字符串的ip地址,形如:192.16.1.1
使用函数 unsigned long inet_addr ( const char FAR* ip);可以将字符串形式的ip地址转换成in_addr结构形式的地址
例子:
int sockfd;
struct sockaddr_in my_addr; //定义一个端口地址
sockfd = socket(AF_INET, SOCK_STREAM, 0); //创建套接字
my_addr.sin_family = AF_INET; //必须是
my_addr.sin_port = htons(MYPORT); //使用htons把计算机字节顺序转换成网络字节顺序
my_addr.sin_addr.s_addr = inet_addr("192.168.0.1"); //
ZeroMemory(&(my_addr.sin_zero), 8); //最后8个必须字节为0
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
u_short htons(u_short netshort); // h ost to n et s hort 计算机的u_short字节顺序转换为网络的字节顺序
u_short htonl(u_short netlong); // host to net long 计算机的u_long字节顺序转换为网络的字节顺序
u_long ntohl(u_long netlong); // net to host long 网络的字节的u_long字节顺序转换为计算机的字节顺序
u_short ntohs(u_short netshort); // net to host short 网络的字节的u_short字节顺序转换为计算机的字节顺序