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

enr00

enr00

Routinier
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$
 
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 argc, char** argv) {

	struct hostent* p_hostent;
	int i;

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

	if ( NULL == (p_hostent = gethostbyname( argv[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;
		char* h_alias;
		char** h_aliases = p_hostent->h_aliases;
		
		while(NULL != (h_alias = h_aliases[i])) {
			printf("%3d: %s\n",i+1, h_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_t* h_addr;
		char** p = p_hostent->h_addr_list;
		
		while(NULL != (h_addr = (in_addr_t*) p[i])) {
			 printf("%3d: %s\n",i+1, inet_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.
 
Zuletzt bearbeitet:
gethostbyname->h_addr gibts in meiner netdb.h nicht
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...
 
h_addrist ein Makro, ungefähr so:
Code:
#define h_addr h_addr_list[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.
und eigentlich will ich zu einem hostnamen die ip-adressen finden, und nicht zu den ipadressen den hostnamen...
...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.
 
Zuletzt bearbeitet:
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$
 
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...
 
Zuletzt bearbeitet:

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

C HTTP request

NagiosGrapher 1.7.1 funktioniert nicht

Problem mit Texteingabe

kann ich diesen c-code ausführen, wenn ja wie?

Zurück
Oben