C/C++

2017-03-06 20 views
-2

でchar配列で、私はローカルIPアドレスをAQUIREするために自分自身の機能を構築し、一緒に私は16の長さの文字列を使用しています。このサイトGet the IP Address of local computerC/C++

から提供された別の関数を使用していますこれは進捗中の返り値です192.168.056.001Íýýýý、 "192.168.056.001"と "\ 0"のようなものでなければなりません。ここで間違っていなければなりません。 UDPパケットを作成してイーサネット経由で接続します。

char* YourApplication::GetMyIP() { 
    char* IPAdd = new char[16]; 
    if (YourApplication::GenerateIP(MyIP)) { 
     int b1 = MyIP.b1; 
     int hundreds,tens; 
     if (b1 < 100) { 
      IPAdd[0] = '0'; 
      if (b1 < 10) { 
       IPAdd[1] = '0'; 
       IPAdd[2] = b1 + 48; 
      } 
      else { 
       tens = b1/10; 
       IPAdd[1] = tens + 48; 
       IPAdd[2] = b1 % 10 + 48; 
      } 
     } 
     else { 
      hundreds = b1/100; 
      IPAdd[0] = hundreds+48; 
      tens = (b1 - 100*hundreds)/10; 
      IPAdd[1] = tens+48; 
      IPAdd[2] = (b1 - 100 * hundreds - 10 * tens) + 48; 
     } 
     IPAdd[3] = '.'; 
     int b2 = MyIP.b2; 
     if (b2 < 100) { 
      IPAdd[4] = '0'; 
      if (b2 < 10) { 
       IPAdd[5] = '0'; 
       IPAdd[6] = b2 + 48; 
      } 
      else { 
       tens = b2/10; 
       IPAdd[5] = tens + 48; 
       IPAdd[6] = b2 % 10 + 48; 
      } 
     } 
     else { 
      hundreds = b2/100; 
      IPAdd[4] = hundreds + 48; 
      tens = (b2 - 100 * hundreds)/10; 
      IPAdd[5] = tens + 48; 
      IPAdd[6] = (b2 - 100 * hundreds - 10 * tens) + 48; 
     } 
     IPAdd[7] = '.'; 
     int b3 = MyIP.b3; 
     if (b3 < 100) { 
      IPAdd[8] = '0'; 
      if (b3 < 10) { 
       IPAdd[9] = '0'; 
       IPAdd[10] = b3 + 48; 
      } 
      else { 
       tens = b3/10; 
       IPAdd[9] = tens + 48; 
       IPAdd[10] = b3 % 10 + 48; 
      } 
     } 
     else { 
      hundreds = b3/100; 
      IPAdd[8] = hundreds + 48; 
      tens = (b3 - 100 * hundreds)/10; 
      IPAdd[9] = tens + 48; 
      IPAdd[10] = (b3 - 100 * hundreds - 10 * tens) + 48; 
     } 
     IPAdd[11] = '.'; 
     int b4 = MyIP.b4; 
     if (b4 < 100) { 
      IPAdd[12] = '0'; 
      if (b4 < 10) { 
       IPAdd[13] = '0'; 
       IPAdd[14] = b4 + 48; 
      } 
      else { 
       tens = b4/10; 
       IPAdd[13] = tens + 48; 
       IPAdd[14] = b4 % 10 + 48; 
      } 
     } 
     else { 
      hundreds = b4/100; 
      IPAdd[12] = hundreds + 48; 
      tens = (b4 - 100 * hundreds)/10; 
      IPAdd[13] = tens + 48; 
      IPAdd[14] = (b4 - 100 * hundreds - 10 * tens) + 48; 
     } 
    } 
    return IPAdd; 
} 

、以下そのサイトからその関数である:(などのstdとして::文字列)バイト文字列を操作するライブラリを使用して

bool YourApplication::GenerateIP(IPv4 & myIP) 
{ 
    char szBuffer[1024]; 

#ifdef WIN32 
    WSADATA wsaData; 
    WORD wVersionRequested = MAKEWORD(2, 0); 
    if (::WSAStartup(wVersionRequested, &wsaData) != 0) 
     return false; 
#endif 


    if (gethostname(szBuffer, sizeof(szBuffer)) == SOCKET_ERROR) 
    { 
#ifdef WIN32 
     WSACleanup(); 
#endif 
     return false; 
    } 

    struct hostent *host = gethostbyname(szBuffer); 
    if (host == NULL) 
    { 
#ifdef WIN32 
     WSACleanup(); 
#endif 
     return false; 
    } 

    //Obtain the computer's IP 
    myIP.b1 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b1; 
    myIP.b2 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b2; 
    myIP.b3 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b3; 
    myIP.b4 = ((struct in_addr *)(host->h_addr))->S_un.S_un_b.s_b4; 

#ifdef WIN32 
    WSACleanup(); 
#endif 
    return true; 
} 
+3

CはC++ではありません。デバッガを使用するか、[MCVE]を指定してください。 –

+1

''\ 0''を扱うために' char * IPAdd = new char [16];が 'char * IPAdd = new char [16 + 1];'でなければならないと思います。 – Ingenioushax

+0

私はちょうど私が個々に、そして手動で各要素を割り当てたのかと疑問に思いました、なぜ "Íýýýý"のような文字がありますか?そして、NDAのおかげで、私は他の部分についての詳細を述べることはできません。また、この機能と無関係でもありません。私は配列に15要素しか与えず、16番目は\ 0のために残されます。 –

答えて

1

は自動的に配列の最後に終端文字を追加します。ただし、すべての値を自分で設定しているので、IPAddr [15] = '\ 0'に設定する必要があります。

+0

Thx、 '\ 0'を自分で追加します。ここではコードベースのエンジンを使用しているので、char型の文字列を使って他の部分と一貫性を持たせなければなりません。 –

関連する問題