2011-05-23 115 views
1

它不會總是發生,但會在服務器應用程序運行很長一段時間時發生。這種分段錯誤的原因是什麼?

什麼原因,我該如何解決?

代碼如下:

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

Result定義在哪裏?它可能是未初始化的。 – eyalm 2011-05-23 09:04:53

+0

當您打印結果和*結果時會發生什麼? – nos 2011-05-23 09:05:10

+0

@ eyalm,@ nos,更新了更多信息。 – DriverBoy 2011-05-23 09:08:06

回答

0

也許,源和目的的存儲區域重疊?即

&Result->sin_addr >= Host->h_addr >= &Result->sin_addr + sizeof(Result->sin_addr) 
+0

它似乎當這種情況發生'主機 - > h_addr'根本不存在.. – DriverBoy 2011-05-23 09:06:50

+0

@DriverBoy,它是什麼等於呢? – vines 2011-05-23 09:09:06

+0

'{h_name = 0xc4ee048「」,h_aliases = 0xc4ee030,h_addrtype = 2,h_length = 4,h_addr_list = 0xc4ee038}'在我的問題中提供。 – DriverBoy 2011-05-23 09:14:28

0

memcpy失敗。

這可以通過 引起(1)sin_addr和H_ADDR不是相同的尺寸或 (2)sin_addr是一個指針並且尚未爲它malloc分配存儲器。

請提供Result的定義和初始化以獲取更多信息。

+0

我在上面的原始問題中更新了'Result'的定義。 – DriverBoy 2011-05-23 09:15:31

3

鑑於主機和結果變量都指向合法的內存塊,最可能的原因是Host->h_addrNULL。如果由gethostbyname()gethostbyaddr()返回的地址列表爲空,則會出現這種情況。

我不知道如何可能導致(我的OS X系統上的文檔暗示如果沒有地址可以找到這兩個函數應返回NULL)。不過,我會在調試器中檢查Host->h_addr_list[0]以確認。

編輯

調試信息的更新顯示問題出在哪裏:Host->h_addr爲NULL。 H_ADDR實際上是這樣的#定義:

#define h_addr h_addr_list[0] 

上述功能之一返回一個struct hostent與空地址列表。

+0

@ JeremyP,我更新了'Host-> h_addr_list [0]' – DriverBoy 2011-05-23 10:15:18

+0

@DriverBoy:我說得對。您正在從空指針複製。 – JeremyP 2011-05-23 10:36:32

+0

@ JeremyP,但代碼對我來說看起來相當有效。 – 2011-05-23 12:42:32

相關問題