2010-03-21 38 views
1

我是一個套接字編程新手。這裏有一個片段:奇怪的客戶端地址返回通過接受(..)功能

struct sockaddr_storage client_addr; 

... 

client_addr_size = sizeof(client_addr); 
client_socket = accept(server_socket, 
    (struct sockaddr *)&client_addr, &client_addr_size); 

... 

result = inet_ntop(AF_INET, 
    &((struct sockaddr_in *)&client_addr)->sin_addr, 
    client_addr_str, sizeof(client_addr_str)); 

我正在作爲服務器工作。無論何時,無論主機如何,客戶端連接的地址都是0.0.0.0。任何人都可以解釋,我做錯了什麼?

謝謝。

回答

2

檢查client_addr.ss_family - 可以返回一個AF_INET6家庭住址。

+0

是的,那是對的。我已經解決了這個問題。還有一個人會興奮起來。我在提示中使用帶AI_PASSIVE的getaddrinfo函數。 我稍後將地址綁定到is ::。好嗎? – 2010-03-22 20:12:54

+0

是的,沒關係(只要套接字仍然是'AF_INET6')。 – caf 2010-03-22 21:24:08

0

您可以顯示更多的代碼...您嘗試連接到什麼IP地址/服務?

的線索是在IP地址本身,0.0.0.0,通常其中一個網絡接口都沒有分配IP地址的情況,可能是在尋找一個DHCP服務器更新/接受來自某處DHCP租約..

由於您沒有提供足夠的信息,我正在拍攝自己的腳,因此被認爲是不公平的,因此得不到滿意的結果,因爲這個答案不能滿足您的問題!

+0

他沒有把*連接到*任何東西;他充當服務器並接受連接。 – 2010-03-21 13:41:18

0

只是猜測 - 什麼是client_addr_str的聲明?如果是char*然後sizeof(client_addr_str)將返回指針的大小(4或8,根據32位或64位平臺。)請嘗試以下操作:

char client_addr_str[INET_ADDRSTRLEN]; 
if (inet_ntop(AF_INET, 
    &((struct sockaddr_in *)&client_addr)->sin_addr, 
    client_addr_str, INET_ADDRSTRLEN) == NULL) 
{ 
    /* complain */ 
}