我正在为繁忙的盒子构建固件应用程序。我的应用程序使用所有与套接字相关的系统调用,但是当我运行程序时,即使服务器端口打开(使用 netstat -nl 检查),客户端也无法连接到服务器。
是否可以检查繁忙框,如果我正在使用的系统调用在操作系统上启用?
更新:连接到服务器套接字的程序在设备 1 上运行,但同一程序在设备 2 上无法运行。 device2有内核更新,这就是我在想是否不支持某些系统调用的原因。
connect 系统调用后给出的错误是 errno - 97。这是不支持的协议(protocol)族。
我发现问题是由下面的代码部分引起的。
ADDRINFOA 提示; PADDRINFOA 结果;
hints.ai_family = AF_INET;
if (getaddrinfo (hostname, NULL, &hints, &result) == 0)
{
memcpy (sockaddr, result->ai_addr, result->ai_addrlen);
freeaddrinfo (result);
}
在 Getaddrinfo 之后,sockaddr.ss_family 为 0。我预计为 2
我在这里做错了什么?有什么帮助吗?
最佳答案
如果您没有以不常见的配置编译内核,则应包含所有网络功能(这意味着应包含与网络相关的系统调用)
发布失败的代码可能是一个想法,已经在评论中指出(遵循@SomeProgrammerDude 的评论)
编辑
系统调用使用固定的注册标识符(内部整数 id)来选择正确的系统调用,这必须与不同的内核和不同的标准库配合使用,这些内核和标准库绑定(bind)我们知道系统调用的标识符名称。如果修改其中任何一个,就会破坏 stdlib 接口(interface)(或内核),因此它们是固定的。即使功能未实现,系统调用入口点也必须工作。通常,在未实际实现的系统调用上,有一个 stub 函数限制在调用时给出错误。
关于c++ - 如何知道我使用的Linux操作系统是否有特定的系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49623976/