C语言网络族函数htonl()、htons()、inet_addr()、inet_ntoa()实现

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;
}

发布了22 篇原创文章 · 获赞 21 · 访问量 3146

猜你喜欢

转载自blog.csdn.net/weixin_42844163/article/details/104253201
今日推荐