C语言 通过 BSD 套接字在本地网络上获取我的计算机的 IP 地址



由于BSD套接字中没有获取IP地址的功能,我做了客户端/服务器程序来建立连接。 每个线程对应一个线程:服务器和客户端。

从本地主机的"inet_ntoa"返回的 IP 地址是 127.0.0.1。
但是网络说我的电脑是这个10.0.0.7,这个地址是有效的。

如何获取 10.0.0.7 地址?感谢

这是我的代码:

DWORD WINAPI CIpAddressDlg::Thread_TcpServer(LPVOID iValue)
{
      CIpAddressDlg *pp = (CIpAddressDlg*)iValue;
      CString c;
      char buffer[128]; 
      int sinlen;
      struct sockaddr_in sin; 
      int s, h; 
      sin.sin_family = AF_INET; 
      sin.sin_addr.s_addr = INADDR_ANY;
      sin.sin_port = htons(4000);   // Port 
      s = socket(AF_INET, SOCK_STREAM,0);
      bind(s,(struct sockaddr*)&sin,sizeof(sin));
      listen(s,1);
      sinlen = sizeof(sin);      
      h=accept(s,(struct sockaddr*)&sin,&sinlen );
      //get IP address
      int len = sizeof sin;
      if(::getsockname(h,(struct sockaddr*)&sin,&len) == -1)
            pp->MessageBox("Error local host ip");
      c.Format("%dnlocal addr %s:%un  errno: %d", sin.sin_addr, inet_ntoa(sin.sin_addr),ntohs(sin.sin_port), errno);
      pp->MessageBox(c);
      //verification of send
      recv(h,buffer,sizeof(buffer),0);
      pp->MessageBox(buffer);
      send(h,buffer,strlen(buffer),0);
      ::closesocket(s);
    return 0;
}

DWORD WINAPI CIpAddressDlg::Thread_TcpClient(LPVOID iValue)
{
    CIpAddressDlg *pp = (CIpAddressDlg*)iValue;
    CString c;
      char buffer[128]= "Hello world"; 
      struct sockaddr_in sin; 
      struct hostent *host; 
      int s; 
      host = gethostbyname("localhost");  
      memcpy(&(sin.sin_addr), host->h_addr,host->h_length); 
      sin.sin_family = host->h_addrtype; 
      sin.sin_port = htons(4000);
      s = socket(AF_INET, SOCK_STREAM,0);                       
      connect(s,  (struct sockaddr*)&sin,sizeof(sin));     
      send(s,buffer,strlen(buffer)+1,0); 
      recv(s,buffer,sizeof(buffer),0);
      ::closesocket(s);     
    return 0;
}

尽管该概念具有直观的吸引力,并且就此而言,对该概念的普遍信任,但计算机没有IP地址。

接口具有 IP 地址。

您可以获取接口列表并选择第一个接口。 不幸的是,获取大多数语言的接口列表取决于系统。

通常的方法是只使用0.0.0.0

有更简单的方法可以获取运行程序的计算机的"私有"/"LAN"IP。 不过,您的解决方案非常巧妙

我认为最直接的可能是GetAdaptersAddresses. MSDN 页面上的示例代码似乎非常全面。

但是,如果这需要更新的编译器版本,请考虑 GetAdaptersInfo 。 请参阅此处的"方法三"和此处的一些示例代码。

此外,您似乎还可以通过WinSock API访问IP地址。 请参阅此示例。

最后,作为旁注,BSD套接字中有一个功能可以做到这一点(getifaddrs()),它只是没有移植到Windows。

最新更新