2017-03-06 4 views
-2

Je suis construire ma propre fonction pour acquérir l'adresse IP locale et, ensemble, en utilisant une autre fonction de ce site Get the IP Address of local computerA propos de la fin de caractère dans un tableau de caractères en C/C++

J'utilise un tableau de caractères 16 longueur , et c'est la valeur de retour de pendant la progression, 192.168.056.001Íýýýý, il devrait être comme "192.168.056.001" et un '\ 0', quelque chose doit être faux ici, juste ne peut pas comprendre. Et ceci cause des problèmes quand je l'envoie à travers l'Ethernet en créant des paquets 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; 
} 

Et ci-dessous est cette fonction de ce site:

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 n'est pas C++. Utilisez un débogueur ou fournissez un [MCVE]. –

+1

Je pense que vous avez un problème hors-un 'char * IPAdd = new char [16];' devrait être 'char * IPAdd = new char [16 + 1];' pour prendre en compte ''\ 0'' – Ingenioushax

+0

Je me demandais juste que j'ai assigné chaque élément individuellement et manuellement, pourquoi il y a des caractères comme "ýýýý"? Et en raison de la NDA, je ne peux pas donner de détails sur d'autres parties, et c'est aussi sans rapport avec cette fonction, désolé pour cela. Je ne donne que le tableau 15 éléments, le 16 est laissé pour le \ 0. –

Répondre

1

Utilisation des bibliothèques qui manipule des chaînes d'octets (comme std :: string) ajouterait automatiquement un caractère de fin à la fin du tableau. Cependant, comme vous définissez vous-même toutes les valeurs, vous devez définir IPAddr [15] = '\ 0'.

+0

Thx, je vais ajouter le '\ 0' moi-même. Comme nous utilisons un moteur basé sur le code ici, je dois utiliser une chaîne de type char pour être cohérent avec les autres parties, et je n'ai pas essayé d'envoyer un paquet avec une chaîne auparavant. –