1

BSD ソケットには IP アドレスを取得する機能がないため、接続を確立するためにクライアント/サーバー プログラムを実行しました。サーバーとクライアントのそれぞれに 1 つのスレッド。

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;
}
4

2 に答える 2

2

概念の直感的な魅力と、さらに言えば、この概念に対する幅広い信念にもかかわらず、コンピューターにはIPアドレスがありません。

インターフェイスにはIPアドレスがあります。

インターフェイスのリストを取得して、最初のインターフェイスを選択できます。残念ながら、ほとんどの言語でインターフェイスのリストを取得することは、システムに依存します。

通常のアプローチは、を使用すること0.0.0.0です。

于 2012-06-08T23:51:41.713 に答える
0

プログラムが実行されているマシンの「プライベート」/「LAN」IPを取得する簡単な方法があります。しかし、あなたの解決策は非常に独創的です。

最も簡単なのはおそらくGetAdaptersAddressesです。MSDNページのサンプルコードはかなり徹底しているようです。

ただし、新しいバージョンのコンパイラが必要な場合は、を検討してGetAdaptersInfoください。ここの「方法3」とここいくつかのサンプルコードを参照してください。

また、WinSockAPIを介してIPアドレスにアクセスすることもできるようです。この例を参照してください。

最後に、補足として、BSDソケットには、これを正確に実行する関数(getifaddrs())がありますが、これはWindowsに移植されていません。

于 2012-06-08T23:45:45.720 に答える