【问题标题】:Get hostname and IP address of the remote client connected in a different network获取连接在不同网络中的远程客户端的主机名和 IP 地址
【发布时间】:2012-10-28 08:10:13
【问题描述】:

如何检索请求连接到我的服务器的对等客户端的 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;
}

【问题讨论】:

  • 你为什么还要这个?你不能用别人的 NAT/防火墙后面的 ip 做任何事情。此外,它们很可能都是重复的 - 例如你会得到很多看起来像 192.168.1.* 的 ips

标签: c ip-address


【解决方案1】:

如果我正确阅读了您的问题,则客户端位于重写源 IP 地址的 NAT 框后面,而您需要原始 IP 地址。如果是这种情况,除了要求客户端将其发送给您之外,您无法找到“真实”IP 地址。

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2018-04-30
    • 2019-11-02
    相关资源
    最近更新 更多