tai*_*ino 2 c sockets macos gcc
我遇到了一个问题,即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;
}
Run Code Online (Sandbox Code Playgroud)
我搜索了一会儿,找到了一个添加了一个包含"arpa/inet.h" 的解决方案.我确认inet_ntoa肯定是在inet.h中声明的,我确信这是正确的方法.
但我无法理解为什么没有它这个代码不起作用.当我在没有包含行的情况下构建和链接此代码时会发生什么?
我知道构建此代码会显示警告"隐式声明函数",但不会发生链接错误.这意味着链接器以某种方式找到了inet_ntoa的实现,我想.这是错的吗?
谢谢!任何建议都非常感谢.
| 归档时间: |
|
| 查看次数: |
1045 次 |
| 最近记录: |