Longip ... probleme [Résolu]

Signaler
Messages postés
654
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
10 février 2009
-
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006
-
Salut :)
Voila j'ai un petit probleme avec un code qui est censé me renvoyer le longip, il me retourne -795585024 au lieu de 2130772483 (longip de 127.1.2.3), voici mon code:

void longip(char ip[15]) {
char *b = strdup(ip);
char *ip1 = strtok(ip,".");
char *ip2 = strtok(0,".");
char *ip3 = strtok(0,".");
char *ip4 = strtok(0,".");
int ip5 = (int) ip1*256*256*256;
int ip6 = (int) ip2*256*256;
int ip7 = (int) ip3*256;
int ip8 = ip5+ip6+ip7;
char result[10];
sprintf(result,"%d\n",ip8);
printf(result);
}

merci de votre aide !

win

8 réponses

Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Faut aussi corriger deux/trois trucs...
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void) {
  char ip[16];
  strcpy(ip,"127.1.2.3");
  char *ip1 = strtok(ip,".");
  char *ip2 = strtok(0,".");
  char *ip3 = strtok(0,".");
  char *ip4 = strtok(0,".");
  unsigned long ip5 = (unsigned long) atoi(ip1)*256*256*256;
  unsigned long ip6 = (unsigned long) atoi(ip2)*256*256;
  unsigned long ip7 = (unsigned long) atoi(ip3)*256;
  unsigned long ip8 = (unsigned long) atoi(ip4);
  printf("%lu\n", ip5 + ip6 + ip7 + ip8);
  return 0;
}
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
voici deux fonctions qui font la meme chose (en mieux je pense):

// avec atoi (bof)
unsigned long _ip(char * ip)
{
BYTE tmp[4];
char * c = ip;
for(int i = 0; i < 4; i++)
{
tmp[i] = atoi(c);
while(*c != '.' && *c) c++; c++;
}
return *((unsigned long*)tmp);
}

// sans atoi
unsigned long __ip(char * ip)
{
BYTE tmp[4];
char * c = ip;for(BYTE *b tmp, *f b + 4; b < f; b++)
{
*b = 0;
while(*c != '.' && *c)
{
*b *= 10;
*b += (*c++ - '0');
}
c++;
}
return *((unsigned long*)tmp);
}
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Essaie avec des unsigned long.
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Tu castes un char* en int, et ca donne le bon resultat ?
Messages postés
1905
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
17 septembre 2012
3
Salut,
Faudrait pas l'appeler trop souvent cette func quand meme (4 appels de strtok() + 4 appels d'atoi() pour convertir une ip en DWORD, ouch).
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
C'est sûr mais bon je me base sur son exemple.
Messages postés
654
Date d'inscription
jeudi 3 avril 2003
Statut
Membre
Dernière intervention
10 février 2009
1
ok ça fonctionne nikel, merci les gars ;)

win
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Encore mieux, utiliser les fonctions réseau standards qui servent à ca:

in_addr_t inet_addr(const char *cp);


et (pas disponible sur tous les systèmes):

int inet_aton(const char *cp, struct in_addr *addr);


Kaid - kaid.fr.st