2009-11-07 133 views
0

看到下面的代碼:什麼IP地址不接受退貨

​​

我的客戶從本地主機連接。 我在輸出中得到了一個荒謬的地址。這不是我的IP地址。每當我運行代碼我得到一個不同的IP地址。當我ping那個IP地址時,我沒有得到任何迴應。

是什麼原因。

我在windows vista的虛擬機上運行suse linux。

更新

bzero(&cliaddr, sizeof(cliaddr)); 
int connfd = accept(sockfd, (struct sockaddr*)&cliaddr, &slen); 

if (sem_wait(&mutex) < 0) 
    err_sys("sem_init error"); 

char ipv4addr[100]; 
cout << inet_ntop(AF_INET, &cliaddr.sin_addr, ipv4addr, 100) << endl; 

//const char* p = inet_ntop(AF_INET, &cliaddr.sin_addr, ipv4addr, 100); 
//cout << p << endl; 

//cout << (void*)p << " " << (void*)ipv4addr << endl; 

這個返回地址爲0.0.0.0

如果我取消註釋行,我得到了所有行的正確地址,127.0.0.1

+0

我在代碼中看到一個信號量 - 確保其他線程不會同時使用相同的地址結構。即這可能是一種競爭條件。 –

+0

該代碼不會將'slen'參數初始化爲accept調用。確保你將slen設置爲sizeof(cliaddr)。 – nos

+0

@Nikolai:只有一個線程運行 –

回答

4

您在致電inet_ntop()時錯過了第4個參數。這是一個工作示例:


    int sockfd, fd; 
    struct sockaddr_in saddr; 
    socklen_t len = sizeof(saddr); 
    char addr_buf[INET_ADDRSTRLEN]; /* defined in <netinet/in.h> */ 

    /* ... socket(), bind(), listen() */ 

    bzero(&saddr, len); 
    if ((fd = accept(sockfd, (struct sockaddr*)&saddr, &len)) == -1) 
    { perror("accept"); exit(1); } /* watch out for EINTR */ 

    if (inet_ntop(AF_INET, &saddr.sin_addr, addr_buf, 
    INET_ADDRSTRLEN) == NULL) 
    { perror("inet_ntop"); exit(1); } 

    printf("accepted connection from [%s:%d]\n", 
    addr_buf, ntohs(saddr.sin_port)); 
    ... 

與網絡交談時總是檢查錯誤。

+0

len沒有初始化。因此錯誤。 –

+0

+「與網絡交談時總是檢查錯誤」。 –

0

我未經證實的猜測是,您將獲得IP v6地址而不是v4,因此您的轉換已關閉。

您可能想嘗試使用netstat來查找客戶端的端口(通常您會得到一個1025到65535之間的隨機排序端口號),並查看十六進制值是否出現在cliaddr的十六進制表示中。如果客戶端端口與您認爲是客戶端地址之間存在關聯,那麼您的轉換不正確。

+0

客戶端使用屬於AF_INET系列的套接字進行連接,並且正在本地主機上運行。 –

+0

inet_ntop在這種情況下也應該返回一個錯誤。 –

+0

我可能有另一種解釋。看到我的其他答案。 –

0

我的下一個猜測:

On success, inet_ntop() returns a non-null pointer to dst. NULL is 
     returned if there was an error, with errno set to indicate the error. 

是COUT。 < <聰明到足以取消引用正在返回的指針,或者你打印出指針嗎?

+0

爲什麼要打印 232.76.213.191 –

+0

我認爲它與虛擬機有關。 –

+0

好吧,我放棄了。祝你好運!我的程序中的 –