gpt4 book ai didi

c - inet_ntoa 发生了什么?

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

让我很困惑,这个例子有不同的结果。是不是我哪里出了问题。

#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>


int main(){
struct sockaddr_in src;
struct sockaddr_in dest;

memset(&src, 0, sizeof(src));
src.sin_addr.s_addr = 0xEBAE277D;

memset(&dest, 0, sizeof(dest));
dest.sin_addr.s_addr = 0x6700A8C0;

printf("saddr:%s\n", inet_ntoa(src.sin_addr));
printf("daddr:%s\n", inet_ntoa(dest.sin_addr));
printf("src:%15s------->dest:%15s\n", inet_ntoa(src.sin_addr), inet_ntoa(dest.sin_addr));
}

结果:

saddr:125.39.174.235
daddr:192.168.0.103
src: 125.39.174.235------->dest: 125.39.174.235

最佳答案

inet_ntoa 的文档说:

The inet_ntoa() function converts the Internet host address in, given in network byte order, to a string in IPv4 dotted-decimal notation. The string is returned in a statically allocated buffer, which subsequent calls will overwrite.

(来自 Linux 手册页;其他人有不同的措辞,但有关静态缓冲区的警告应该在某处)

因此,您调用了 inet_ntoa 一次,缓冲区已被填充,并返回了指向它的指针。您再次调用它,缓冲区被覆盖,并且再次返回指向它的指针。您将这两个指针传递给 printf,它打印了两次缓冲区内容。

要正确执行此操作,您需要在再次调用之前将第一个 inet_ntoa 结果复制到您自己的本地缓冲区中,或者仅使用 2 个 printf

或者您可以使用inet_ntop代替,这需要您自己提供输出缓冲区。 (调用者提供的输出缓冲区在较新的接口(interface)中更常见;静态输出缓冲区一开始看起来很简单,但从长远来看会导致像代码中那样的事故。)

关于c - inet_ntoa 发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47970618/

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