2013-08-28 48 views
1

IM試圖瞭解如何連接互聯網槽插槽(但段錯誤的IM stuck.cause。)我不明白爲什麼這個代碼給段錯誤:是你能幫助我。inet_ntop功能段錯誤(可能是投誤差)

int main() 
{ 
    int status; 
    WSADATA wsa; 
    struct addrinfo hints ,*servinfo; 
    struct sockaddr_in *servSock; 
    char *ip4; 

    /**initialization*/ 
    WSAStartup(MAKEWORD(2 ,0) ,&wsa); 

    memset((void *)&hints ,NULL ,sizeof(hints)); 
    hints.ai_family = AF_INET; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_flags = AI_PASSIVE; 

    ip4 = (char *)malloc(sizeof(char)*INET_ADDRSTRLEN); 

    /**End of initialization*/ 

    status = getaddrinfo("www.google.com",DEF_PORT,&hints,&servinfo); 
    checkErr("serv info" ,status ,0 ,equal ,gai_strerror); 

    servSock = (struct sockaddr_in *)(servinfo->ai_addr); 

    status = inet_ntop(AF_INET ,&(servSock->sin_addr) ,ip4,INET_ADDRSTRLEN); 
    checkErr("ntop" ,status ,NULL ,nEqual ,gai_strerror); 

    printf("IPv4 : %s",ip4); 

    free(ip4); 
    WSACleanup(); 
} 

代碼爆炸在inet_ntop線(IDK爲什麼,導致IM小白^^)

+1

[完整版本的代碼](http://pastebin.com/A8Ts4Exv)如果你想調試它:) –

+0

[image](http://i.imgur.com/8ofQYly.png)我得到這個手錶結果當我使用'&((結構SOCKADDR_IN *)(servinfo-> ai_addr)) - > sin_addr' [圖像](http://i.imgur.com/ZGRDfDd.png)我得到這個觀測結果時我使用'&(servSock-> sin_addr)' &我從這些結果中瞭解到當我使用'servSock =(struct sockaddr_in *)(servinfo-> ai_addr);'代碼 –

回答

0

這可能工作:

unsigned char ip4buf[4]; 
memcpy(ip4buf,(struct sockaddr_in *)(servinfo->ai_addr)->sin_addr,4); 
... 
inet_ntop(AF_INET,(void *) (&ip4buf)ip4,INET_ADDRSTRLEN); 
+0

inet_ntop(AF_INET ,&(servSock-> sin_addr),ip4,INET_ADDRSTRLEN); 我沒有得到哪一個失蹤? 'INT AF - > AF_INET' 'const的無效*限制的src - >&(servSock-> sin_addr)'' 字符*限制DST - > ip4' 'socklen_t的大小 - > INET_ADDRSTRLEN' 不是嗎? @jev –

+0

我更新了帖子 – jev

+0

其實我不明白,代碼(即時新手)你能解釋它嗎? –

1

您可以檢查是否&(servSock-> sin_addr)是有效的。

+0

實際上,這個代碼工作正常,當我嘗試,但即時通訊嘗試獲得更短,更容易理解的版本。 '狀態= inet_ntop(AF_INET,&((結構SOCKADDR_IN *)(servinfo-> ai_addr)) - > sin_addr,屬於IP4,INET_ADDRSTRLEN);' 但是當我嘗試使用代碼即時得到無法訪問地點:S –

0

我明白了。當你使用Windows API時。 gai_strerror(int errno)使得它不穩定,我們應該用WSAGetLastError()功能。(gai_strerror改變-after測試我的代碼噸的時候,我得到這個結果我servinfo指針數據。)& MSDN建議使用WSAGetLastError線程安全使用。

日Thnx任何幫助。 &這是我對這個問題的註釋。