gpt4 book ai didi

c - OSX 上的 inet_ntoa() 段错误

转载 作者:行者123 更新时间:2023-12-04 11:14:45 27 4
gpt4 key购买 nike

我遇到了 inet_ntoa 导致 OSX 上的段错误的问题,这不会发生在 Linux 上。

我的测试代码如下。

// sample.c
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
//#include <arpa/inet.h> // adding this line prevents the segfault

int main() {
struct sockaddr_in addr;
struct sockaddr_in client;

int sock0 = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = INADDR_ANY;

bind(sock0, (struct sockaddr *)&addr, sizeof(addr));
listen(sock0, 5);

while (1) {
int len = sizeof(client);
int sock = accept(sock0, (struct sockaddr *)&client, (socklen_t *)&len);
printf("accepted connection from %s, port=%d\n",
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
send(sock, "HELLO", 5, 0);
close(sock);
}

close(sock0);

return 0;
}

找了一会儿,找到了a solution这是添加一个包含“arpa/inet.h”。我确认 inet_ntoa 肯定是在 inet.h 中声明的,我确信这是正确的方法。

但我不明白为什么没有它这段代码就不能工作。如果我在没有 include 行的情况下构建和链接此代码,会发生什么情况?

我知道构建此代码会显示警告“函数的隐式声明”,但不会发生链接错误。我认为这意味着链接器以某种方式找到了 inet_ntoa 的实现。这是错误的吗?

谢谢!非常感谢任何建议。

最佳答案

我猜你的 OSX 系统是 64 位的,而你的 Linux 系统是 32 位的。假定未声明的函数返回一个整数。如果 64 位指针衰减为 32 位整数并作为指针取消引用,您可能会遇到段错误。

关于c - OSX 上的 inet_ntoa() 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17140107/

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