0

サーバーへの接続を要求しているピア クライアントの 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;
}
4

1 に答える 1

2

あなたの質問を正しく読んだ場合、クライアントは送信元 IP アドレスを書き換える NAT ボックスの背後にあり、元の IP アドレスが必要です。その場合、クライアントに送信するように依頼する以外に、「本当の」IP アドレスを見つけるためにできることは何もありません。

于 2012-10-28T08:16:37.027 に答える