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