gethostbyname klappt nicht richtig



  • Hallo,

    ich schreibe mir gerade einen kleinen TCP-Client.
    Jetzt versuche ich mir die IP Adresse über den Servernamen zu holen, per gethostbyname.
    Das klappt auch, nur wenn ich einen Server eingebe, den es gar nicht gibt, stürzt das Programm ab.
    Ich habe meine Vorgehensweise auch schon mit vielen Beispielcodes abgeglichen, nur finde ich den Fehler nicht.

    struct hostent *ptrh;
    
    ptrh = gethostbyname( hostnameOrIp );
    
    if( ptrh == NULL )
    {
       return SOCKET_ERROR;
    }
    else
    {
       memcpy( &(addr->sin_addr), ptrh->h_addr, ptrh->h_length );
    }
    

    Man sollte doch meinen, wenn es den Servernamen nicht bei mir gibt, sollte gethostbyname doch NULL zurück geben, das tut es aber nicht.



  • long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr) { 
       long rc; 
       unsigned long ip; 
    
       HOSTENT* he; 
    
       if(hostnameOrIp==NULL || addr==NULL) 
          return SOCKET_ERROR; 
       ip=inet_addr(hostnameOrIp); 
    
       if(ip!=INADDR_NONE){ 
          addr->sin_addr.s_addr=ip; 
          return 0; 
       } else { 
          he=gethostbyname(hostnameOrIp); 
          if(he==NULL) { 
             return SOCKET_ERROR; 
          } else { 
             memcpy(&(addr->sin_addr),he->h_addr_list[0],4); 
          } 
          return 0; 
       } 
    }
    

    MFG



  • Danke für den Codesnipsel, aber das ist einer der ersten die ich überprüft habe.
    Er macht am Ende nichts anderes als meiner, wenn gethostbyname fehlschlägt soll er angeblich einen Nullpointer zurück geben, tut er aber nicht.

    Stattdessen stehen in he->h_addr_list Müllpointer drin, welche man nicht zu IP_adressen verarbeiten kann.

    Hat noch jemand eine Idee?



  • bitte zeig mal ein vollständiges beispiel.



  • Ein vollständiges Beispiel dafür, das gethostbyname im Fehlerfalle nicht NULL ist?
    Das erste Posting nach meinem ist doch eine vollständige Funktion aus einem Beispiel. Da wird doch versucht zu ermitteln, ob der angegebene Host eine IP-Adresse war oder ein Hostname.
    Das Problem ist, das es so aber nicht funktioniert, falls es den Host nicht gibt, da dort wieder nur auf NULL geprüft wird.

    .
    .
    .
    he=gethostbyname(hostnameOrIp); 
    if(he==NULL) {
    .
    .
    .
    


  • MSDN schrieb:

    Note The gethostbyname function has been deprecated by the introduction of the getaddrinfo function. Developers creating Windows Sockets 2 applications are urged to use the getaddrinfo function instead of gethostbyname.

    Denk mal darüber nach.

    Ansonsten könntest du auch nach dem Aufruf den Fehlerstatus abfragen (per WSAGetLastError()):

    WSASetLastError(0);
    he=gethostbyname(adresse);
    if(WSAGetLastError()!=0)
      Fehler
    

Anmelden zum Antworten