【发布时间】:2018-04-03 06:54:38
【问题描述】:
我正在为一个繁忙的盒子构建一个固件应用程序。我的应用程序使用了所有与套接字相关的系统调用,但是当我运行程序时,即使服务器端口打开,客户端也无法连接到服务器(使用 netstat -nl 检查)。
如果我正在使用的系统调用在操作系统上启用,是否可以检查忙框?
更新:连接到服务器套接字的程序在设备 1 上运行,而同一程序在设备 2 上不运行。 device2 对内核进行了更新,这就是我在考虑是否不支持某些系统调用的原因。
在连接系统调用后给出的错误是 errno - 97。这是不支持的协议族。
我观察到问题是由下面的代码部分引起的。
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
我在这里做错了什么?有什么帮助吗?
【问题讨论】:
-
首先,请不要使用多语言标签。仅使用您实际编程的语言。其次,请read about how to ask good questions 并学习如何创建Minimal, Complete, and Verifiable Example。最后,尝试连接时遇到什么错误?您确实检查了
connect调用给您带来了什么错误? -
没有禁用系统调用这样的事情。您系统上的某些功能可能会被 SELinux 安全系统阻止,但它不会禁用系统调用,它会根据安全上下文阻止某些 I/O 操作。您的问题是 X/Y 问题的示例。你必须诊断为什么你没有得到连接。你有防火墙吗?调用返回什么错误代码?您可以 ping、traceroute 到目的地吗?
-
感谢“一些编程老兄”的投入,感谢您不投反对票。我正在删除这个问题,因为我发现我的问题是由于连接期间出现了一些套接字错误(errno 97 - 不支持地址系列)。我将发布一个单独的格式良好的问题。
-
@Swift - 将内核配置为没有特定的系统调用(例如
CONFIG_NETWORK=n)可能算作“禁用”它们。 -
在运行时检查它的方法是运行一个执行系统调用的程序,看看调用是否失败并将errno设置为
ENOSYS。 (现在 - 如果您的服务器正在运行并在某个端口上侦听,那么您可能在其他地方遇到问题,例如尝试使用内核不支持的协议,或者防火墙或路由问题 - 而不是缺少系统调用)
标签: c++ c linux-kernel network-programming busybox