c - 通过 BSD 套接字获取我计算机在本地网络上的 IP 地址?

标签 c sockets

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

使用 localhost 从“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("%d\nlocal addr %s:%u\n  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 地址。

接口(interface)有 IP 地址。

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

通常的方法是只使用 0.0.0.0

关于c - 通过 BSD 套接字获取我计算机在本地网络上的 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10956890/

相关文章:

sockets - 套接字和网络套接字的区别?

c - posix fork() & win32 CreateProcess() 之后的子进程名称是什么?

c - C 中带有函数指针的 Typedef?

c++ - libusb 在 IDE 中不可见

c - 在不同接口(interface)上接收具有相同源地址的不同组播

python - 无法在Python中创建线程

python - 在 python 中解析来自 WIZ110SR 的 TCP/IP 串行数据

c - 如何将数据保存在已知内存位置一次以便在 x86 程序集中多次重用?

c - 重复调用 C 函数会导致 R - 如何分配内存?

javascript - Node.js/Express - 如何通过方法(使用套接字)访问 session 数据?