IPv4寻址

在winsock中,应用程序通过SOCKADDR_IN结构来指定IP地址和服务端口信息,机构如下

  1. struct sockaddr_in 
  2.   short  sin_family; 
  3.   u_short sin_port; 
  4.   struct in_addr sin_addr; 
  5.   char  sin_zero[8]; 
  6. }; 

sin_family必须使用AF_INET,以告知winsock此时正在使用iP地址族。

sin_port标识服务端口号

sin_addr字段把IPv4地址作为一个4字节的量存储起来,它是无符号长整数的数据类型。

 

inet_addr是一个实用的函数,可以把一个点分IP地址转换为一个32位无符号长整数

  1. unsigned long inet_addr(const char FAR *cp); 

cp是一个空终止字符串,用于表示IP地址。

 

字节排序

下面4个API函数将一个数从主机字节顺序转换成网络字节顺序。

  1. u_long htonl(u_long hostlong); 
  2. int WSAHtonl(SOCKET s, u_long hostlong, u_long FAR *lpnslong); 
  3.  
  4. u_short htons(u_long hostshort); 
  5. int WSAHtons(SOCKET s, u_short hostshort, u_short FAR * lpsshort); 

下面4个函数是上面的逆函数,把网络字节转换为主机字节

  1. u_long ntohl(u_long netlong); 
  2. int WSANtohl(SOCKET s, u_long netlong, u_long FAR* lphostlong); 
  3.  
  4. u_short ntohs(u_short netshort); 
  5. int WSANtohs(SOCKET s, u_short netshort, u_short FAR* lphostshort); 

演示

  1. SOCKADDR_IN InternetAddr; 
  2. int nPortID = 5050; 
  3.  
  4. InternetAddr.sin_family = AF_INET; 
  5. InternetAddr.sin_addr.s_addr = inet_addr("123.123.123.123"); 
  6. InternetAddr.sin_port = htons(nPortID);