它不会一直发生,但会在服务器应用程序运行很长一段时间后发生。
原因是什么?我该如何解决?
代码如下:
struct hostent* Host;
Result->sin_family=AF_INET;
Result->sin_port=htons((unsigned short)Port);
Host=gethostbyname(HostName);
if(!Host)
{
unsigned long int addr=inet_addr(HostName);
if(addr!=-1)
Host=gethostbyaddr(&addr,sizeof(addr),AF_INET);
if(!Host)
{
if(errno!=ETIMEDOUT)
errno=-1; /* use h_errno */
printf("Unknown host for server [%s].", HostName);
return(0);
}
}
memcpy((char*)&Result->sin_addr,(char*)Host->h_addr,sizeof(Result->sin_addr));
核心转储:
#0 0x0000000000401913 in proxy_getaddr (HostName=0x7ae30be0 "stackoverflow.com", Port=80, Result=0x7ae30bd0) at proxy.c:529
529 memcpy((char*)&Result->sin_addr,(char*)Host->h_addr,sizeof(Result->sin_addr));
(gdb) p *Host
$4 = {h_name = 0xc4ee048 "", h_aliases = 0xc4ee030, h_addrtype = 2, h_length = 4, h_addr_list = 0xc4ee038}
(gdb) print Result
$5 = (struct sockaddr_in *) 0x7ae30bd0
(gdb) print *Result
$6 = {sin_family = 2, sin_port = 20480, sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}
(gdb) p Host->h_addr_list[0]
$1 = 0x0
(gdb) p Host->h_addr_list
$2 = (char **) 0x1bd9d050
答案 0 :(得分:3)
鉴于Host和Result变量都指向合法的内存块,最可能的原因是Host->h_addr
是NULL
。如果gethostbyname()
或gethostbyaddr()
返回的地址列表为空,则会出现这种情况。
我不知道是怎么造成的(我的OS X系统上的文档暗示如果找不到地址,两个函数都应该返回NULL)。但是,我会在调试器中检查Host->h_addr_list[0]
以确认。
修改强>
调试信息的更新显示问题所在:Host->h_addr
为NULL。 h_addr实际上是这样的#define:
#define h_addr h_addr_list[0]
其中一个函数是返回带有空地址列表的struct hostent
。
答案 1 :(得分:0)
也许,源和目标内存区域重叠?即。
&Result->sin_addr >= Host->h_addr >= &Result->sin_addr + sizeof(Result->sin_addr)
答案 2 :(得分:0)
memcpy失败了。
这可能是由于 (1)sin_addr和h_addr的大小不同或者 (2)sin_addr是一个指针,你没有malloc内存。
请提供结果的定义和初始化以获取更多信息。