2012-10-28 29 views
0

我如何檢索等客戶端請求連接到我的server.Both客戶端和服務器連接在不同的網絡獲取連接在不同的網絡遠程客戶端的主機名和IP地址

我試過的IP地址和主機名getpeername()..但是,當客戶端和服務器連接在同一個網絡中時,它會給出正確的IP地址。

Socket* SocketServer::Accept() 
{ 

    struct sockaddr_in cli_addr; 
    struct hostent *hp; 
    int clilen = 0;  
    clilen = sizeof (cli_addr); 

    SOCKET new_sock = accept(s_, (struct sockaddr *) &cli_addr, &clilen); 
    if (new_sock == INVALID_SOCKET) 
    { 
     SetLastError(WSAGetLastError()); 
     // std::cout<<"Socket invalid due to :"<<WSAGetLastError()<<endl; 
     WSACleanup(); 
    } 
    Socket* r = new Socket(new_sock); 
    //std::cout<<" Accepted Connection"<<endl; 

    int ret = getpeername(new_sock, (struct sockaddr *)&cli_addr, &clilen); 

    struct sockaddr_in *s = (struct sockaddr_in *)&cli_addr; 
    std::string ip = inet_ntoa(cli_addr.sin_addr); 

    //cout << " The IP address from the accept is " << ip << std::endl; 


    hp = gethostbyaddr((char *)&cli_addr.sin_addr,sizeof(cli_addr.sin_addr),AF_INET); 
    std::string cliname; 
    if (hp!=NULL) 
    cliname = hp->h_name; 
    r->setDNS(cliname); 
    r->setIP(ip); 
    return r; 
} 
+0

你爲什麼要這樣?對於其他人的NAT /防火牆後面的IP,你無法做任何事情。除了它們可能都是重複的 - 例如你會得到很多ips,看起來像192.168.1。* –

回答

2

如果我正確地讀你的問題,客戶端是落後重寫源IP地址的NAT框,你希望原始之一。如果是這樣的話,就沒有辦法找到「真實的」IP地址,而不會要求客戶把它發送給你。

相關問題