- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个 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/
这个问题已经有答案了: Weird printf behaviour with inet_ntoa (2 个回答) 已关闭 5 年前。 让我很困惑,这个例子有不同的结果。是不是我哪里出了问题。 #in
有人知道 MySql INET_NTOA() 如何将整数值转换回 IP 地址格式吗?我想知道内部如何进行计算以将IP转换为其原始互联网标准点分十进制格式。 最佳答案 它使用网络将一个整数分解为四个字节
我在数据库中有一个表 (sessions),其第一列包含数字 IP 地址,例如: _____________ | srcIP | ------------- | 167973143 | | 1
inet_ntoa() 函数导致以下代码中的 Segmentation fault 错误。请告诉我,为什么。我该如何解决?非常感谢! void ClientAdd ( int clientSocket
我在/usr/include/arpa/inet.h 中看到下面这行: extern char *inet_ntoa (struct in_addr __in) __THROW; 但是它真正定义在哪里
我正在声明以下变量 unsigned long dstAddr; unsigned long gateWay; unsigned long mask; 这些变量包含网络字节顺序的 IP 地
#include #include /* for strncpy */ #include #include #include #include
尝试为数据包嗅探器编写处理程序。我在转换和 inet_ntoa() 方面遇到问题。代码如下: uint32_t *iphdr_srcaddr = malloc(sizeof(uint32_t)); i
我正在尝试使用 inet_ntoa 函数写入以下代码: printf("Got connection from: %s:%d\n", inet_ntoa(cli_addr.sin_addr.s_add
我使用函数 char* inet_ntoa(struct in_addr in), 编写了一个服务器当我包含标题时 和 ,可以生成带有编译器警告的可执行二进制文件,但是当程序处理来自 inet_nt
浏览 GNU C 库的源代码,我发现 inet_ntoa 是用 static __thread char buffer[18] 我的问题是,既然需要使用可重入的inet_ntoa,为什么GNU C库的
考虑以下程序: #include #include #include #include #include #include void printhost(cha
我应该是瞎了,因为我在 ubuntu 和 debian 的发行版中找不到这些命令,也没有包含它们的包。 我应该自己用 C 编写代码和编译它们(或者用 perl 或其他任何语言编写或查找此代码)还是它(
我正在理解 gethostbyname() 函数。当时我找到了下面的示例程序。 #include #include #include #include #include #include
好的,在发布这个问题之前,我已经检查了这里的线程 in_addr_t to string 我的问题不一样。 我知道 inet_ntoa 函数属于以下类型 char * inet_ntoa (struc
// char ip1[] = "127.0.0.1"; char ip2[] = "211.100.21.179"; printf("ip1: %s\nip2: %s\n", ip1, ip2);
#include #include #include #include #include int main(int argc, char **argv) { struct socka
我遇到了 inet_ntoa 导致 OSX 上的段错误的问题,这不会发生在 Linux 上。 我的测试代码如下。 // sample.c #include #include #include #
我查看了 inet_ntoa 的实现喜欢 this和 this , 我想知道为什么他们都分配了一个 18 个字符的缓冲区。 如果我取最大长度的 IPv4 地址字符串:255.255.255.255我需
当我在没有 arpa/inet.h 包含的情况下使用 inet_ntoa 时,编译器为什么不报告错误? 我运行了这段代码: struct sockaddr_in dest; printf("%d\n"
我是一名优秀的程序员,十分优秀!