c - 索拉里斯 8-10 : host2ip conversion problems

标签 c unix networking tcp solaris

我正在处理一个非常特殊的问题。 我有在 solaris 8/sparc 平台上由旧编译器(gcc 2.95 或更早版本)编译的代码。它在 solaris 8/sparc 上运行良好,但在 solaris 10/sparc 上崩溃。 (solaris 10 应该向后兼容 solaris 8)

在调试时,我发现当应用程序尝试将主机名转换为相应的 i/p 地址时会出现问题。它使用 gethostbyname_r,然后是 inet_ntoa 来获取 ipv4 quad dotted number。通过解决方案的 gdb 使我看到 gethostbyname_r 返回的 in_addr 具有表示 i/p 地址的正确整数,但 inet_ntoa 调用返回格式错误的字符串。确认确实是inet_ntoa失败的一个难点在于代码是这样写的

strcpy(hostaddr, inet_ntoa(*((struct in_addr *) hostdata.h_addr)));

所以从技术上讲,我看不到 inet_ntoa 返回的值。但我可以做一个

print (char*)inet_ntoa(*((struct in_addr *) hostdata.h_addr_list[0]))

在 gdb 上查看(我认为这足够接近)并且它打印格式错误的 i/p 地址。例如,“0.0.”。 (主机名有一个有效的 i/p 地址,可以从那台机器上解析,因此以 0.0 开头的 i/p 也不是正确的值)

您可以看到,将不安全的 strcpy 与 inet_ntoa 一起使用会产生一些未知,并导致段错误。

很高兴听到有过类似经历的人关于 inet_ntoa 这种失败的可能原因。该系统不知何故发挥了作用,我什至无法确定它可以做什么来解决这个问题。

我们将不胜感激所有评论。

约束:我无法修改代码以使其工作(否则这很容易解决)。因此,尽管知道 strcpy 是一个非常不安全的函数 w.r.t 段错误,并且 inet_ntoa 已被弃用,但我在这方面无能为力。

编辑: 我觉得这是一个并行处理问题。我不确定,但我不认为该应用程序是多线程的。但是新的sol10机器是64核的机器。思想链的原因是 inet_ntoa 唯一真正的问题是静态缓冲区,代码确实在循环中进行此调用。

最佳答案

我发现链接器(当然还有错误的代码)是问题所在。 一些 super 好人,尽管拥有一个与标准库函数 (inet_ntoa_r) 同名的函数是个好主意。当我在将我的代码与库链接时尝试使用 -static 选项时,它开始提示用户库文件中存在此符号。一旦我从用户库中删除了该函数,它就会从崩溃中继续(到我正在尝试修复的其他问题。期待另一个问题 :))。 希望有人觉得这有用

关于c - 索拉里斯 8-10 : host2ip conversion problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12395007/

相关文章:

我可以使用 char[] 或 char* 作为函数的返回值吗?

c - GCC ARM C 编译器不遵守 -std=c99 的 %llx printf 格式化代码

c - 为什么我们需要同时初始化或声明两个维度​​而不是在c中一个接一个

linux - 在 shell 中组合命令有效,但在运行 .sh 文件时无效

c - 尽管没有到达字符串的末尾,strtok 返回 NULL

linux - 远程端口转发或代理转发

java - android - 检测低网络信号,依赖哪个值

networking - 如何设置服务质量?

c# - 远程共享文件夹和驱动器 C#

c - 如果明确捕获,SIGINT 仅在子进程上收到