2016-06-27 21 views
1

Ich versuche eine IP-Adresse (derzeit IPv4, aber erkennt IPv6) von einem int-Array-Format in eine formatierte Zeichenfolge zu konvertieren. Ich arbeite an Ubuntu Linux.Probleme beim Ändern der IP-Adresse von int in Zeichenfolge

Ich unterscheide zwischen IPv4 und IPv6-Adressen, und dann versuchen, das int-Array in eine Zeichenfolge zu konvertieren.

Dies ist der Code, den ich verwende:

#include <stdio.h> 
#include <string.h> 
#include <arpa/inet.h> 

int main(void) 
{ 
    int i; 
    unsigned int val32; 
    int ma_ip[4]; 
    char m_ip[4]; 
    char ipaddr[INET_ADDRSTRLEN], ipv6[INET6_ADDRSTRLEN]; 
    int no = 0; 
    char *token; 
    char s3[] = "10.1.35.1"; 
    /* just example. test only one ip address.. */ 
    for(i = 0; i < 1; i++) 
    { 
     char *mm = strstr(s3, ":"); 
     if(*mm != NULL) 
     { 
      token = strtok(s3, ":"); 
      while(token != NULL) 
      { 
       token = strtok(NULL, ":"); 
       no++; 
      } 
      if(no >= 2 && no <= 7) 
       printf("\nthis is ipv6\n"); 
      else 
       printf("\nwrong ipv6\n"); 
     } 
     else 
     { 
      token = strtok(s3, "."); 
      while(token != NULL) 
      { 
       token = strtok(NULL, "."); 
       no++; 
      } 
      if(no == 4) 
      { 
       printf("\nthis is ipv4.\n"); 
       val32 = inet_addr(s3) 
       ma_ip[i] = val32; 
      } 
      else 
       printf("\nwrong ipv4.\n") 
     } 
     inet_ntop(AF_INET,&ma_ip[0],ipaddr,INET_ADDRSTRLEN); 
     printf("\nipaddr = %s\n", ipaddr); 
     strcpy(&m_ip[0], ipaddr); 
     printf("\nafter strcpy = %s\n", m_ip[0]); 
    } 
} 

Dieser Ausgang ist falsch:

ipaddr = 0.0.0.10 

Es sollte eigentlich sein:

ipaddr = 10.1.35.1 

Ich habe auch diesen Fehler in der letzten printf nach der strcpy:

Format ‚% s‘ erwartet Argument vom Typ ‚char *‘, aber Argument 2 hat ‚int‘ Fehler geben! **

, warum dies geschieht, und wie kann ich es beheben?

Antwort

-1

Dies ist eine tragfähige Version. Das Problem deines Codes ist, strtok() trimmt die Zeichenkette 's3'. Mit der Zeit n == 4 erhält die Zeichenkette nur noch "10".

#include <stdio.h> 
#include <string.h> 
#include <arpa/inet.h> 
#include <malloc.h> 

int main(void) 
{ 
    int i; 
    unsigned int val32; 
    int ma_ip[4]; 
    char m_ip[4]; 
    char ipaddr[INET_ADDRSTRLEN], ipv6[INET6_ADDRSTRLEN]; 
    int no = 0; 
    char *token; 
    char s3[] = "10.1.35.1"; 
    char *s4 = malloc(strlen(s3)+1); 
    strcpy(s4, s3);    //You can save the original string. 
    /* just example. test only one ip address.. */ 
    for(i = 0; i < 1; i++) 
    { 
     char *mm = strstr(s3, ":"); 
     if(mm != NULL) 
     { 
      token = strtok(s3, ":"); 
      while(token != NULL) 
      { 
       token = strtok(NULL, ":"); 
       no++; 
      } 
      if(no >= 2 && no <= 7) 
       printf("\nthis is ipv6\n"); 
      else 
       printf("\nwrong ipv6\n"); 
     } 
     else 
     { 
      token = strtok(s3, "."); 
      while(token != NULL) 
      { 
       token = strtok(NULL, "."); 
       no++; 
      } 
      if(no == 4) 
      { 
       printf("\nthis is ipv4.\n"); 
       val32 = inet_addr(s4); //use the intact string s4, instead of s3. 
       ma_ip[i] = val32; 
      } 
      else 
       printf("\nwrong ipv4.\n"); 
     } 
     inet_ntop(AF_INET,&ma_ip[0],ipaddr,INET_ADDRSTRLEN); 
     printf("\nipaddr = %s\n", ipaddr); 
     strcpy(&m_ip[0], ipaddr); 
     printf("\nafter strcpy = %s\n", m_ip); 
    } 
} 
+0

Danke !!!! Es klappt! – kara

+0

'strcpy (& m_ip [0], ipaddr);' ist furchtbar falsch. Verwenden Sie nicht 'strcpy', verwenden Sie' strncpy'.'char [4]' ist eindeutig nicht groß genug für eine formatierte IP-Adresse. – Zulan

+0

Ja, Sie haben Recht. Ich habe gerade das strtok() - Problem des Codes bemerkt und schnell daran geändert. Habe das strcpy() Problem nicht bemerkt. Vielen Dank. – Lin

0

m_ip[0] zeigt auf die Position des ersten Elements. Wenn Sie die Zeichenfolge drucken möchten, versuchen Sie bitte mit m_ip, d. H. Array-Name oder &m_ip[0], die grundsätzlich die Adresse des ersten Elements übergibt, die als pointer interpretiert werden könnte und im Wesentlichen zu Segmentierungsfehler führt. Mit m_ip wird gedruckt (aber immer noch nur 0.0.0.10).

Ein weiterer Punkt in Ihrem Programm ist, dass Sie mm mit NULL nach strstr Betrieb vergleichen sollten.

Für die Netzwerkadresse Manipulation, ich würde Ihnen empfehlen, einen Blick auf this question.

+0

ich möchte mehr detail lösung. Danke für deine Antwort. – kara

0

Ich habe bestimmte Zweifel in Ihrem Programm. konvertieren Sie eine IP-String

char s3[] = "10.1.35.1"; 

auf eine ganze Zahl und wieder zurück zu String ??

Ich denke, das ist, was Sie

struct sockaddr_in sa; 
char str[INET_ADDRSTRLEN]; 

// store this IP address in sa: 
inet_pton(AF_INET, "192.0.2.33", &(sa.sin_addr)); 

// now get it back and print it 
inet_ntop(AF_INET, &(sa.sin_addr), str, INET_ADDRSTRLEN); 

printf("%s\n", str); // prints "192.0.2.33" 

In Bezug auf die letzte printf nach strcpy müssen, sollte es

printf("\nafter strcpy = %s\n", m_ip); 
+1

Statt 'inet_pton' und' inet_ntop' wäre es besser, 'getaddrinfo()' und 'getnameinfo()' zu verwenden. – glglgl

+0

danke. Ich werde es versuchen. – kara

+0

so ,, sa.sin_addr ist Integer, und konvertieren Stachel wird inet_ntop ??? – kara