背景
我们有一个小型无头盒运行Linux内核2.6.35,并且在手臂硬件上有一些开放嵌入式分布的变体。
据我们所知,我们正在使用glibc 2.10.1。
盒子具有未连接的以太网和一个连接的GSM/3G调制解调器。我们已经配置了PPP,以确保继续与Internet连接。这部分无问题。
我们有一个在C(实际上C )中编码的程序,该程序使用插座建立了一些连接。该程序使用pthreads进行了大量多线程。
查找IP地址以连接到我们使用GethostByName()。
当与互联网没有连接时,例如在初始启动期间或从调制解调器中删除SIM卡时,GethostbyName()会返回NULL。
症状
但是,即使Internet连接启动并运行了范围,gethostbyname()仍保持返回null。
使用eai_noname〜"名称或服务未知"时,来自getAddrinfo()的错误代码。我们没有来自GethostByName()的错误代码,但这是等效的。
我们的分析
我们已经确保了Internet连接可以通过(通过串行控制台)
- 列表项目
- 查看/var/log/邮件并确保pppd表示一切正常
- ping hostName(转换为IP并回答确定)
- 通过公共IP 通过SSH连接到框
我们在此过程中有两个线程,可以将GethostByName()用于同一主机。它们具有略有不同的代码路径和功能,但使用插座功能的常见代码,包括调用GethostByName()的部分。
在GethostbyName()持续返回null的情况下,这通常仅对其中一个线程而不是相同。另一个使查找完美。
此外,可以通过该线程的简单控制停止和重新启动功能轻松地使带有失败的GethostByName()的线程轻松地使其功能,从而导致新线程PTHREAD。
总共我们确信DNS翻译和Internet连接在操作系统级别正常。
为了排除线程问题,我们已经使用getAddrinfo()重新实现了查找代码,该代码是根据MAN页面重新进入的。并以完全相同的结果。
对我们来说,线程的出口似乎会导致某种清理,从而影响GethostbyName()/getAddrinfo()进行查找的能力。
解决方法的解决方法是执行故障线程的退出,但这意味着应用程序结构的重大变化,并不是真正的选择。
问题
所以问题是:您是否有任何指示可以在哪里寻找解决方案或真正的问题?
char *hostname = "www.example.com";
struct hostent *a_server;
a_server=gethostbyname(hostname);
while (a_server == NULL) {
a_server=gethostbyname(hostname);
sleep(1);
}