Socket-Verständnisproblem (was: ICH bin zu BLÖD !!!)
-
Hi,
#include <windows.h> #include <winsock.h> #include <iostream> #pragma comment(lib, "ws2_32.lib") using namespace std; int main(void) { char szHostname[255]; char *szIPAddress; WSADATA wsadata; PHOSTENT phostent; if(WSAStartup(MAKEWORD(2, 0), &wsadata) == 0) { if(gethostname(szHostname, sizeof(szHostname)) == 0) if((phostent = gethostbyname(szHostname)) != NULL) szIPAddress = inet_ntoa(*(struct in_addr *)*phostent->h_addr_list); WSACleanup(); } cout << "IP-Adresse: " << szIPAddress << endl; return 0; }Also ich versteh ja das obrige listing soweit ganz gut nur werd' ich
aus folgender Zeile nicht schlau
szIPAddress = inet_ntoa(*(struct in_addr *)*phostent->h_addr_list);hab inet_ntoa und in_addr auch schon in der MSDN nachgeschlagen
nur irgendwie hat mich das auch nicht weitergebracht.Was ich nicht verstehe :

+ warum lässt sich das listing auch ohne "struct" einwandfrei compilieren ?
+ warum wird szIPAddress als Pointer declariert (char *szIPAddress) ?
+ was genau bewirkt (struct in_addr
? geht es nicht auch ohne ?
+ müsste es nicht &phostent->h_addr_list heissen ? bzw. inet_ntoa(&(struct in_addr &)&phostent->h_addr_list);
+ warum heisst es PHOSTENT phostent und nicht HOSTENT phostent ?Ich hoffe ihr könnt mir da weiterhelfen.
DANKE schonmal im Voraus.
MfG
edit: Bitte aussagekräftigen Titel verwenden: wmfrs
-
dideldum04 schrieb:
+ warum wird szIPAddress als Pointer declariert (char *szIPAddress) ?
Weil inet_ntoa char* als Rückgabetyp hat

dideldum04 schrieb:
+ was genau bewirkt (struct in_addr
? geht es nicht auch ohne ?Das ist ein Cast - damit sagst du dem Compiler, dass du schlauer bist als er und das als Pointer auf eine in_addr-Struktur interpretiert werden soll.
dideldum04 schrieb:
+ müsste es nicht &phostent->h_addr_list heissen ? bzw. inet_ntoa(&(struct in_addr &)&phostent->h_addr_list);
Wie kommst du denn darauf
Das sind Pointer, die du dereferenzieren willst - und das macht man eben mit * 
Mit & kannst du dir von einer "normalen" Variable die Adresse holen - und vieles anderes mehr
dideldum04 schrieb:
+ warum heisst es PHOSTENT phostent und nicht HOSTENT phostent ?
Weil du auch hier einen Pointer auf HOSTENT haben willst. In der WinAPI sind die P's vor Datentypen meist (immer?) Deklarationen für Pointer auf den entsprechenden Datentyp. Das soll dann zur besseren Lesbarkeit dienen - denk ich mal

-
danke erstmal für die antwort

Also ich versteh das mit den Zeigern nicht ganz

Ist denn
pchar test;dasselbe wie
char* test;bzw.
char *test;?
Ich dachte einem Zeiger weisst man mit & einen wert zu also z.B.
int zahl = 1; int *zahl2; *zahl2 = &zahl; //dann wäre ja *zahl2 = 1 richtig ?Also könnte ich auch folgendes schreiben ?
*zahl2 = zahl;Oder kann ein zeiger selbst auch einen wert annehmen ohne ihm vorher den speicherbereich einer varibalen zuzuordnen z.B. char *test = "Test".
Und was genau meinst du mit "casten" ?

-
Grundlagen???
Kennst Du vielleicht dieses hier?typedef char* pchar;Genau sowas wird in einem der vielen Windows-Header gemacht mit ich-weiss-nicht-wievielen Datentypen. Und wo Strukturen definiert werden, werden immer direkt auch dazugehörige Pointer mittels typedef erstellt.
-
dideldum04 schrieb:
Also ich versteh das mit den Zeigern nicht ganz

Ist denn
pchar test;dasselbe wie
char* test;bzw.
char *test;?
Wenn du PCHAR schreibst ist alles das selbe

dideldum04 schrieb:
Ich dachte einem Zeiger weisst man mit & einen wert zu also z.B.
int zahl = 1; int *zahl2; *zahl2 = &zahl; //dann wäre ja *zahl2 = 1 richtig ?Dem Zeiger kannst du die Adresse eines Speicherbereiches zuweisen, die du z.B. von new bekommst oder auch die Adresse eine anderen Variable (bekommst du mit &)
In deinem Beispiel greifst du jetzt also mit *zahl2 und zahl auf den selben Speicherbereich zu - sprich: wenn du eines änderst ist auch das andere quasi geändert
Du solltest dir wohl die Grundlagen nocheinmal etwas näher anschauen.
dideldum04 schrieb:
Also könnte ich auch folgendes schreiben ?
*zahl2 = zahl;Solange du keinen Speicher reserviert hast geht das so nicht - du bekommst eine Speicherzugriffsverletzung.
dideldum04 schrieb:
Oder kann ein zeiger selbst auch einen wert annehmen ohne ihm vorher den speicherbereich einer varibalen zuzuordnen z.B. char *test = "Test".
Bevor der Pointer nicht auf gültigen Speicher zeigt kann er auch keine Werte speichern. Dein Beispiel geht aber trotzden, da er dann eben auf den Speicher der String-Literal (schreibt man das so?) zeigt.
dideldum04 schrieb:
Und was genau meinst du mit "casten"?

Du sagst dem Compiler damit, dass er diesen Speicher anders zu interpretieren hat.