gpt4 book ai didi

c - 为什么 inet_ntop() 和 inet_ntoa() 给出不同的结果?

转载 作者:行者123 更新时间:2023-11-30 14:54:27 26 4
gpt4 key购买 nike

我正在创建一个 UDP 服务器客户端程序。客户端请求文件,服务器如果找到则将其发送给客户端。基于 Beej 的网络指南,

  • inet_ntoa() returns the dots-and-numbers string in a static buffer that is overwritten with each call to the function.
  • inet_ntop() returns the dst parameter on success, or NULL on failure (and errno is set).

该指南提到 ntoa 已弃用,因此建议使用 ntop,因为它支持 IPv4 和 IPv6。

在我的代码中,当我使用函数或其他函数时,我得到不同的结果,我的理解是它们应该抛出相同的结果。我缺少什么吗?任何帮助将不胜感激。

代码:

    //UDP Client
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#define MAXBUFLEN 1024
#define SER_IP "176.180.226.0"
#define SER_PORT "1212"

// Get port, IPv4 or IPv6:
in_port_t get_in_port(struct sockaddr *sa){
if (sa->sa_family == AF_INET) {
return (((struct sockaddr_in*)sa)->sin_port);
}
return (((struct sockaddr_in6*)sa)->sin6_port);
}

int main(int argc, char *argv[]){
int sock, rv, numbytes;
struct addrinfo hints, *servinfo, *p;
char buffer[MAXBUFLEN];

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;

rv = getaddrinfo(NULL, SER_PORT, &hints, &servinfo);
if (rv != 0){
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv));
exit(1);
}

// Printing IP, should provide same result
for(p = servinfo; p != NULL; p = p->ai_next) {
char str1[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &p->ai_addr, str1, INET_ADDRSTRLEN);
printf("ntop:%s\n", str1) ;
printf("inet_ntoa:%s \n", inet_ntoa(((struct sockaddr_in *)p->ai_addr)->sin_addr));
printf("\n");
}

exit(1);
}

当前输出:

ntop:64.80.142.0
inet_ntoa:0.0.0.0

ntop:160.80.142.0
inet_ntoa:127.0.0.1

最佳答案

根据man页面,以AF_INET为例论点src必须指向 struct in_addr (网络字节顺序)。

在您的 struct addrinfo 中你有一个指向struct sockaddr的指针这基本上是

sa_family_t sa_family;
char sa_data[];

但是,struct sockaddr_in

sa_family_t    sin_family;
in_port_t sin_port;
struct in_addr sin_addr;

所以,你需要更换

inet_ntop(AF_INET, &p->ai_addr, str1, INET_ADDRSTRLEN);

通过任一

inet_ntop(AF_INET, &p->ai_addr->sa_data[2], str1, INET_ADDRSTRLEN);

(src 参数可能是 &p->ai_addr->sa_data[1 << 1] 以避免“魔数(Magic Number)”2 - 计算端口号存储的偏移量)

inet_ntop(AF_INET, &((struct sockaddr_in *)p->ai_addr)->sin_addr, str1, INET_ADDRSTRLEN);

然后它将产生正确的输出。

关于c - 为什么 inet_ntop() 和 inet_ntoa() 给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46679145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com