inet_ntoa在32位机器上没有问题,64位机器又问题

本文详细介绍了如何使用inet_ntoa和inet_ntop函数处理IP地址,特别是针对64位系统的常见问题及解决方案。通过具体示例展示了如何进行IP地址的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


inet_ntoa就是将struct in_addr结构转换为IP地址的形式,用法如下:

char *inet_ntoa(struct in_addr in);  

在服务器端使用accept函数之后,会得到客户端连接的struct sockaddr结构,然后将其转换成struct sockaddr_in结构,此时可以在服务器端得到客户端连接的IP和端口数据。

但是如果在64位的机器上使用,发现现有错误,原因是因为在64位的机器上,inet_ntoa的返回值是一个整形。


解决办法:

方法1:引用#include <arpa/inet.h>头文件。

方法2:使用inet_ntop函数



inet_ntop使用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main (void)
{
char IPdotdec[20]; //存放点分十进制IP地址
struct in_addr s; // IPv4地址结构体
// 输入IP地址
printf("Please input IP address: ");
scanf("%s", IPdotdec);
// 转换
inet_pton(AF_INET, IPdotdec, (void *)&s);
printf("inet_pton: 0x%x\n", s.s_addr); // 注意得到的字节序
// 反转换
inet_ntop(AF_INET, (void *)&s, IPdotdec, 16);
printf("inet_ntop: %s\n", IPdotdec);
}



在 Windows 上实现以下代码跟功能 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8080 #define BUFFER_SIZE 1024 int main() { int serverSocket, clientSocket; struct sockaddr_in serverAddr, clientAddr; socklen_t clientAddrLen; char buffer[BUFFER_SIZE]; // 创建服务端套接字 serverSocket = socket(AF_INET, SOCK_STREAM, 0); if (serverSocket == -1) { perror("Failed to create socket"); exit(EXIT_FAILURE); } // 设置服务器地址信息 memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(SERVER_PORT); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 绑定套接字到指定地址和端口 if (bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) { perror("Failed to bind socket"); exit(EXIT_FAILURE); } // 监听连接请求 if (listen(serverSocket, 5) == -1) { perror("Failed to listen"); exit(EXIT_FAILURE); } printf("Server listening on port %d...\n", SERVER_PORT); // 接受客户端连接 clientAddrLen = sizeof(clientAddr); clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &clientAddrLen); if (clientSocket == -1) { perror("Failed to accept client connection"); exit(EXIT_FAILURE); } printf("Client connected: %s\n", inet_ntoa(clientAddr.sin_addr)); // 接收数据 memset(buffer, 0, sizeof(buffer)); if (recv(clientSocket, buffer, BUFFER_SIZE, 0) == -1) { perror("Failed to receive data"); exit(EXIT_FAILURE); } printf("Client message: %s\n", buffer); // 发送响应 strcpy(buffer, "Hello, Client!"); if (send(clientSocket, buffer, strlen(buffer), 0) == -1) { perror("Failed to send data"); exit(EXIT_FAILURE); } // 关闭套接字 close(clientSocket); close(serverSocket); return 0; } 和 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8080 #define BUFFER_SIZE 1024 int main() { int clientSocket; struct sockaddr_in serverAddr; char buffer[BUFFER_SIZE]; // 创建客户端套接字 clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == -1) { perror("Failed to create socket"); exit(EXIT_FAILURE); } // 设置服务器地址信息 memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(SERVER_PORT); if (inet_pton(AF_INET, SERVER_IP, &(serverAddr.sin_addr)) <= 0) { perror("Failed to set server IP"); exit(EXIT_FAILURE); } // 连接到服务器 if (connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1) { perror("Failed to connect to server"); exit(EXIT_FAILURE); } printf("Connected to server %s:%d\n", SERVER_IP, SERVER_PORT); // 发送数据 strcpy(buffer, "Hello, Server!"); if (send(clientSocket, buffer, strlen(buffer), 0) == -1) { perror("Failed to send data"); exit(EXIT_FAILURE); } // 接收响应 memset(buffer, 0, sizeof(buffer)); if (recv(clientSocket, buffer, BUFFER_SIZE, 0) == -1) { perror("Failed to receive data"); exit(EXIT_FAILURE); } printf("Server response: %s\n", buffer); // 关闭套接字 close(clientSocket); return 0; }
最新发布
07-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值