2013-02-27 44 views
2

我想在C中使用gethostbyname()函数进行网络分配。gethostbyname()错误 - 与内存管理有关

当我尝试这样做

struct hostent *host; 
char* addr = malloc (10*sizeof(char)); 
strcpy (addr, "localhost"); 
host= (struct hostent *) gethostbyname(addr); 

我碰到下面的错误。

glibc detected ./Sender: free(): invalid next size (normal): 0x0000000001584480 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fcdbaca4b96] 
/lib/x86_64-linux-gnu/libc.so.6(fclose+0x155)[0x7fcdbac94815] 
/lib/x86_64-linux-gnu/libc.so.6(+0x103b16)[0x7fcdbad29b16] 
/lib/x86_64-linux-gnu/libc.so.6(__res_maybe_init+0x125)[0x7fcdbad2b3d5] 
/lib/x86_64-linux-gnu/libc.so.6(__nss_hostname_digits_dots+0x3d)[0x7fcdbad2db0d] 
/lib/x86_64-linux-gnu/libc.so.6(gethostbyname+0x8b)[0x7fcdbad32b7b] 
./Sender[0x401858] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fcdbac4776d] 
./Sender[0x400a09] 
======= Memory map: ======== 
00400000-00403000 r-xp 00000000 08:07 3573874       /home/karthik/courses/Sem 6/Networks/Lab/lab4/Sender 
00602000-00603000 r--p 00002000 08:07 3573874       /home/karthik/courses/Sem 6/Networks/Lab/lab4/Sender 
00603000-00604000 rw-p 00003000 08:07 3573874       /home/karthik/courses/Sem 6/Networks/Lab/lab4/Sender 
01584000-015a5000 rw-p 00000000 00:00 0         [heap] 
7fcdbaa10000-7fcdbaa25000 r-xp 00000000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbaa25000-7fcdbac24000 ---p 00015000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbac24000-7fcdbac25000 r--p 00014000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbac25000-7fcdbac26000 rw-p 00015000 08:08 525634      /lib/x86_64-linux-gnu/libgcc_s.so.1 
7fcdbac26000-7fcdbaddb000 r-xp 00000000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbaddb000-7fcdbafda000 ---p 001b5000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbafda000-7fcdbafde000 r--p 001b4000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbafde000-7fcdbafe0000 rw-p 001b8000 08:08 541113      /lib/x86_64-linux-gnu/libc-2.15.so 
7fcdbafe0000-7fcdbafe5000 rw-p 00000000 00:00 0 
7fcdbafe5000-7fcdbb007000 r-xp 00000000 08:08 545991      /lib/x86_64-linux-gnu/ld-2.15.so 
7fcdbb1e4000-7fcdbb1e7000 rw-p 00000000 00:00 0 
7fcdbb203000-7fcdbb207000 rw-p 00000000 00:00 0 
7fcdbb207000-7fcdbb208000 r--p 00022000 08:08 545991      /lib/x86_64-linux-gnu/ld-2.15.so 
7fcdbb208000-7fcdbb20a000 rw-p 00023000 08:08 545991      /lib/x86_64-linux-gnu/ld-2.15.so 
7fff5c673000-7fff5c695000 rw-p 00000000 00:00 0       [stack] 
7fff5c7ff000-7fff5c800000 r-xp 00000000 00:00 0       [vdso] 
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
Aborted (core dumped)` 

我该如何解决这个问题?

+5

你的意思是'gethostbyname(addr);'而不是'gethostbyname(address);'? – 2013-02-27 11:07:45

+1

> gethostbyname *()和gethostbyaddr *()函数已过时。应用程序应该使用getaddrinfo(3)和getnameinfo(3)。链接:http://linux.die.net/man/3/getaddrinfo http://linux.die.net/man/3/getnameinfo由于glibc 2.8:_BSD_SOURCE || _SVID_SOURCE || _GNU_SOURCE – 2013-02-27 11:47:22

+0

“已过时”比“已弃用”更强,这意味着它已被删除,可能已经工作了10年。 POSIX.1-2001指定gethostbyname(),gethostbyaddr(),...在该标准中被标记为过时。 POSIX.1-2008删除了gethostbyname(),gethostbyaddr()的规范... – 2013-02-27 13:33:36

回答

2

代码中某处出现内存损坏,可能是您没有显示的部分。由于您的代码段不是有效的C,我假定您手动键入或将其复制为不完整。

要调试这种情况,如果您位于支持它的平台上(如您所愿),请使用DrMemoryValgrind。我更喜欢Valgrind的功能,而DrMemory可以说更快。

这两个程序都能够查明问题,甚至在有问题的程序仍在运行时将您附加到调试器。所以你可以检查直播节目中的错误条件。


侧面说明:如果你没有以任何方式组装的名字,你可以把它作为一个字符串来gethostbyname

struct hostent *host; 
host = (struct hostent *) gethostbyname("localhost"); 
+0

这也应该是一个评论...不? – speeder 2013-02-27 13:10:28

+1

@speeder,这将是一个很好的答案,如果只有前缀“你的代码中存在内存损坏,在你没有显示的部分。调试它......” – ugoren 2013-02-27 13:40:48

+0

@ugoren:我总是打开建设性的批评。编辑答案。感谢您的建议。 – 0xC0000022L 2013-02-27 13:50:30

0

第一行缺少尾随;

如果不是该OP是真正使用的addr的propably未初始化address而不是这个味道像到gethostbyname()实际调用之前已经happend内存损坏。

在假设

  • 使用address是一个错字和
  • <netdb.h>#include

再说了malloc()的成功缺少的检查,OP的代码正确。

而且看起来是这样的:

#include <netdb.h> 

... 

struct hostent * host = NULL; 
char * addr = malloc (10 * sizeof(*addr)); 
if (!addr) 
    perror("malloc"); 
else 
{ 
    strcpy (addr, "localhost"); 
    host = gethostbyname(addr); 
    ... 

所以,你可能会想用一个内存检查工具如valgrind所以看到什么错误。