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

Diskutiere [C++] Socket Probleme mit Adresse... im C/C++ Forum im Bereich Programmieren unter Linux/Unix; Mein Problem ist, dass immer falsche Werte ausgegeben werden, und bei jedem Hostname wird der gleich falsche Wert ausgegeben... bei localhost...

  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

    Anzeige

    Wenn du mehr über Linux erfahren möchtest, dann solltest du dir mal folgende Shellkommandos anschauen.


    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...
     
Thema:

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

Die Seite wird geladen...

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

  1. [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...
  2. [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...
  3. 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...
  4. 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...
  5. Nginx 1.4.0 mit Websockets und SPDY

    Nginx 1.4.0 mit Websockets und SPDY: Die Entwickler des freien Webservers Nginx haben Version 1.4.0 mit zahlreichen Neuerungen veröffentlicht, wie zum Beispiel die Unterstützung für...
  1. Diese Seite verwendet Cookies um Inhalte zu personalisieren. Außerdem werden auch Cookies von Diensten Dritter gesetzt. Mit dem weiteren Aufenthalt akzeptierst du diesen Einsatz von Cookies.
    Information ausblenden