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

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>int main() { int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字 if (server_socket < 0) { perror("socket"); return 1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8000); int iResult = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 绑定套接字 if (iResult < 0) { perror("bind"); close(server_socket); return 1; } iResult = listen(server_socket, SOMAXCONN); // 监听套接字 if (iResult < 0) { perror("listen"); close(server_socket); return 1; } printf("服务器已启动,等待连接...\n"); int counter = 0; while (1) { struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); // 接受客户端连接 if (client_socket < 0) { perror("accept"); close(server_socket); return 1; } counter++; // 每当有一个新的客户端连接时,计数器加1 printf("客户端 %s:%d 已连接,是今天的第 %d 个客户端。\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), counter); char reply[1024]; sprintf(reply, "你是今天第%d个客户端", counter); send(client_socket, reply, strlen(reply), 0); // 发送回复消息 close(client_socket); } close(server_socket); return 0;},在此代码基础上增加输出当前时间的功能
最新发布
06-10
可以使用time.h头文件中的函数来获取当前时间,并将其格式化输出。修改后的代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <time.h> // 添加时间头文件 int main() { int server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 创建套接字 if (server_socket < 0) { perror("socket"); return 1; } struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(8000); int iResult = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 绑定套接字 if (iResult < 0) { perror("bind"); close(server_socket); return 1; } iResult = listen(server_socket, SOMAXCONN); // 监听套接字 if (iResult < 0) { perror("listen"); close(server_socket); return 1; } printf("服务器已启动,等待连接...\n"); int counter = 0; while (1) { struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); // 接受客户端连接 if (client_socket < 0) { perror("accept"); close(server_socket); return 1; } counter++; printf("客户端 %s:%d 已连接,是今天的第 %d 个客户端。\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), counter); // 添加时间输出 time_t now = time(NULL); struct tm* time_info = localtime(&now); char time_str[20]; strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S", time_info); printf("当前时间是:%s\n", time_str); char reply[1024]; sprintf(reply, "你是今天第%d个客户端", counter); send(client_socket, reply, strlen(reply), 0); close(client_socket); } close(server_socket); return 0; } ``` 这样每当有客户端连接时,服务器就会输出当前的时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值