1.htonl()、htons()函数实现
(1) htonl(): 将主机数转换成无符号长整型的网络字节顺序
(2) htons(): 将主机数转换成无符号短整型的网络字节顺序
#include <WinSock2.h>
/*
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
*/
//htonl()函数实现
u_long Htonl(u_long lHost)
{
char* p = (char*)&lHost;
char c = *p;
*p = *(p + 3);
*(p + 3) = c;
c = *(p + 1);
*(p + 1) = *(p + 2);
*(p + 2) = c;
return lHost;
}
u_short Htons(u_short sHost)
{
char* p = (char*)&sHost;
char c = *p;
*p = *(p + 1);
*(p + 1) = c;
return sHost;
}
2.inet_addr()、inet_ntoa()函数实现
//使用strtok()函数
u_long Inet_addr(const char* pStr)
{
u_long lHost;
char* pHost = (char*)&lHost;
char str[20];
strcpy_s(str, sizeof(str), pStr);
char* token = strtok(str, ".");
while (token)
{
*pHost++ = atoi(token);
token = strtok(NULL, ".");
}
return lHost;
}
//使用strchr()函数
u_long Inet_addr(const char* p)
{
u_long lHost;
char* pHost = (char*)&lHost;
char* pStr = (char*)p;
while (pStr)
{
*pHost++ = atoi(pStr);
pStr = strchr(pStr, '.');
if (pStr)
++pStr;
}
return lHost;
}
//inet_ntoa()函数实现
char* Inet_ntoa(struct in_addr in)
{
static char s[20];
sprintf(s, "%d.%d.%d.%d", in.S_un.S_un_b.s_b1, in.S_un.S_un_b.s_b2,
in.S_un.S_un_b.s_b3, in.S_un.S_un_b.s_b4);
return s;
}