[C++] Socket Probleme mit Adresse...

Dieses Thema im Forum "C/C++" wurde erstellt von enr00, 01.04.2008.

  1. enr00

    enr00 Routinier

    Dabei seit:
    08.04.2007
    Beiträge:
    275
    Zustimmungen:
    0
    Ort:
    Luxemburg
    Mein Problem ist, dass immer falsche Werte ausgegeben werden, und bei jedem Hostname wird der gleich falsche Wert ausgegeben...
    bei localhost müsste ja normalerweise 127.0.0.1 rauskommen??

    Der Code:
    Code:
    #include <iostream>
    #include <string>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <cstdlib>
    #include <netdb.h>
    
    using namespace std;
    
    void help();
    
    int main(int argc, char *argv[])
    {
    
      int sock;
      unsigned short port;
      char host[255];
      unsigned long addr;
      struct sockaddr_in server;
      struct hostent *host_info;
    
      cout << "argc= " << argc << endl;
    
      if(argc == 1)
        {
    
          cout << "Please enter host:";
          cin >> host;
    
          cout << "Plese enter port(Default=51234):";
          cin >> port;
        }
      if(argc == 2)
        {
          if(!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
    	help();
    
          strcpy(host, argv[1]);
          cout << "Please enter port(Default=51234):";
          cin >> port;
        }
      if(argc == 3)
        {
          strcpy(host, argv[1]);
          port = atoi(argv[2]);
        }
    
      sock = socket(PF_INET, SOCK_STREAM, 0);
      server.sin_family = AF_INET;
      server.sin_port = htons(port);
      host_info = gethostbyname(host);
      if(host_info == NULL)
        {
          cout << "Couldn 't resolve host name" << endl;
          exit(1);
        }
      memcpy(&addr, &host_info->h_addr, sizeof(addr));
      addr = ntohl(addr);
      memcpy(&server.sin_addr, &addr, sizeof(addr));
    
      cout << "Punktnotation:   " << inet_ntoa(server.sin_addr) << endl; 
    
      return 0;
    }
    
    
    void help()
    {
      cout << "This help will be extended..." << endl;
      exit(1);
    }
    
    Output:
    Code:
    antr4xx@sidux:~/coding/c$ g++ -o admin admin.cpp
    antr4xx@sidux:~/coding/c$ ./admin localhost 80
    argc= 3
    Punktnotation:   8.4.176.8
    antr4xx@sidux:~/coding/c$ ./admin 127.0.0.1 80
    argc= 3
    Punktnotation:   8.4.176.8
    antr4xx@sidux:~/coding/c$ ./admin 127.0.0.5 80
    argc= 3
    Punktnotation:   8.4.176.8
    antr4xx@sidux:~/coding/c$
    
    
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 der_Kay, 02.04.2008
    Zuletzt bearbeitet: 02.04.2008
    der_Kay

    der_Kay Doppel-As

    Dabei seit:
    28.02.2006
    Beiträge:
    140
    Zustimmungen:
    0
    gethostbyname gibt Listen von Einträgen zurück; ein gethostbyname->h_addr gibts in meiner netdb.h nicht. So geht's:
    PHP:
    #include <stdio.h>
    #include <netdb.h>

    int main int argcchar** argv) {

        
    struct hostentp_hostent;
        
    int i;

        if  (
    argc ) {
            
    fprintf (stderr"erwartet hostname.\n");
            return 
    1;
        }

        if ( 
    NULL == (p_hostent gethostbynameargv[1] ))) {
            
    fprintf (stderr"gethostbyname() %s\n",hstrerror(h_errno));
            return 
    1;
        }

        
    printf"%s: aliases:\n"p_hostent->h_name);

        if ( 
    NULL == (p_hostent->h_aliases)
            || 
    NULL == p_hostent->h_aliases[0]) {
                
    printf("keine.\n"); 
        }
        else {
            
    i=0;
            
    charh_alias;
            
    char** h_aliases p_hostent->h_aliases;
            
            while(
    NULL != (h_alias h_aliases[i])) {
                
    printf("%3d: %s\n",i+1h_alias );
                
    i++;
            }
        }

        
    printf"%s: IPs:\n"argv[1]);

        if ( 
    NULL == (p_hostent->h_addr_list)
            || 
    NULL == p_hostent->h_addr_list[0]){
                
    printf("keine.\n"); 
        }
        else {
            
    i=0;
            
    in_addr_th_addr;
            
    char** p_hostent->h_addr_list;
            
            while(
    NULL != (h_addr = (in_addr_t*) p[i])) {
                 
    printf("%3d: %s\n",i+1inet_ntoa(*h_addr));
                
    i++;
            }
        }
        
        return 
    0;
    }
    Probier mal de.asus.com für ein alias/offiziellen Namen und hp.com für eine IP-Liste.
     
  4. enr00

    enr00 Routinier

    Dabei seit:
    08.04.2007
    Beiträge:
    275
    Zustimmungen:
    0
    Ort:
    Luxemburg
    h_addrist ein Makro, ungefähr so:
    Code:
    #define h_addr h_addr_list[0]
    und eigentlich will ich zu einem hostnamen die ip-adressen finden, und nicht zu den ipadressen den hostnamen...
     
  5. #4 der_Kay, 04.04.2008
    Zuletzt bearbeitet: 04.04.2008
    der_Kay

    der_Kay Doppel-As

    Dabei seit:
    28.02.2006
    Beiträge:
    140
    Zustimmungen:
    0
    Das kam mir nirgendwo unter. Und das ist z. T. die Fehlerquelle: hostent::h_addr_list ein Zeiger auf ein Feld von Zeigern, die im speziellen Fall auf Elemente des Typs in_addr_t (hier uint32_t) verweisen. Das Feld wird durch ein NULL abgeschlossen. Dein memcpy kopiert nur den Integerwert des ersten Zeigers hin- und her. Wie man die IPs dereferenziert, zeigt die untere while-Schleife in meinem Demo.
    ...was mein Demo auch tut. Hast Du auch ganz runtergescrollt? Hast Du es mal laufen lassen? ;) Den Hostnamen von hp habe ich aufgeführt, damit Du nachvollziehen kannst, wie man die Liste h_addr_list korrekt iteriert.
     
  6. enr00

    enr00 Routinier

    Dabei seit:
    08.04.2007
    Beiträge:
    275
    Zustimmungen:
    0
    Ort:
    Luxemburg
    irgendwie bekomme ich das nicht kompiliert:

    Code:
    antr4xx@sidux:~/coding/c++/teamspeak$ g++ -o teamspeak teamspeak.cpp
    teamspeak.cpp: In function ‘int main(int, char**)’:
    teamspeak.cpp:53: error: conversion from ‘unsigned int’ to non-scalar type ‘in_addr’ requested
    antr4xx@sidux:~/coding/c++/teamspeak$    
     
  7. #6 der_Kay, 19.04.2008
    Zuletzt bearbeitet: 19.04.2008
    der_Kay

    der_Kay Doppel-As

    Dabei seit:
    28.02.2006
    Beiträge:
    140
    Zustimmungen:
    0
    Der ursprüngliche Code ist C gewesen. Mit gcc anstatt g++ kompiliert es. Für C++ ersetze
    PHP:
    inet_ntoa(*h_addr)
    durch
    PHP:
    inet_ntoa((in_addr&)*h_addr))
    Das eigentlich notwendige
    PHP:
    #include <arpa/inet.h>
    hast Du bestimmt schon selbst gesehen. Dass die socket-Api für C++ so rumzickt war mir auch neu...
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

[C++] Socket Probleme mit Adresse...

Die Seite wird geladen...

[C++] Socket Probleme mit Adresse... - Ähnliche Themen

  1. [C++] Fehler beim Compiler von HelloWorld

    [C++] Fehler beim Compiler von HelloWorld: hat sich erledigt...
  2. [C++] STL wirft Fehler

    [C++] STL wirft Fehler: Hallo, ich bin ja nicht ganz unbedarft in Sachen C++ aber das hier verstehe ich nicht. Ich möchte etwas die STL austesten. In der Arbeit...
  3. [C++] Windows Freigaben

    [C++] Windows Freigaben: Hi, ich möchte ein Programm in C++ schreiben welches sich von einem Windows-Rechner die Namen der freigegebenen Verzeichnisse abholt und...
  4. GlassFish Server 4.0 unterstützt Java EE 7 und Websockets

    GlassFish Server 4.0 unterstützt Java EE 7 und Websockets: Oracle hat die Open-Source-Edition des skalierbaren Java-Applikationen-Servers Glassfish in der Version 4.0 fertiggestellt. Glassfish 4...
  5. Icinga 1.9 mit Socket Queue und asynchroner Verarbeitung

    Icinga 1.9 mit Socket Queue und asynchroner Verarbeitung: Der Nagios-Fork Icinga ist in der Version 1.9 erschienen. Mit dieser Veröffentlichung feiert die Icinga-Gemeinde auch das vierte Jubiläum der...