Mit Google verbinden
-
Hallo,
ich habe diesen Code:
#include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <Windows.h> #include <iostream> #include <iphlpapi.h> #include <string> #pragma comment(lib, "Ws2_32.lib") using namespace std; int startWinsock(void); int main() { long rc; rc=startWinsock(); SOCKADDR_IN addr; SOCKET s=socket(AF_INET,SOCK_STREAM,0); string adress("http://www.google.de"); if(rc!=0) { cout << "Error! Starting Winsock Failed. Error-Code: "<< rc << endl; getchar(); return 1; } if(s==INVALID_SOCKET) { cout << "Creating Socket Failed!" << endl; getchar(); return 1; } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(80); hostent* host = gethostbyname("http://www.progetto-3.de"); addr.sin_addr = *reinterpret_cast<in_addr*>(host->h_addr); rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { cout << "Connecting failed! Error-Code: " << WSAGetLastError() << endl; getchar(); return 1; } cout << "Verbindung hergestellt!" << endl; char bufferSend[256] = "GET /"; char bufferRecv[1024]; send(s, bufferSend, sizeof(bufferSend), 0); rc=recv(s, bufferRecv, 1024, 0); if(rc==0) { cout << "Error!" << endl; getchar(); getchar(); exit(1); } if(rc==SOCKET_ERROR) { cout << "Fehler! - " << WSAGetLastError() << endl; getchar(); getchar(); exit(1); } cout << bufferRecv << endl; getchar(); getchar(); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }Mein erstes Programm mit Sockets...
Also wenn ich es starte dann bekomme ich von MSVC++ eine "Fehlermeldung":
Unbehandelte Ausnahme bei 0x76f815de in Sock.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x0000000c.0x0000000c -> 12, heist das es hat etwas mit der Funktion startWinsock zu tun?
Grüße!
-
Erstelle das Programm als Debug-Version, dann zeigt der Debugger dir, an welcher Stelle es kracht.
-
Rückgabewert von gethostbyname prüfen.
-
MSDN: "If no error occurs, gethostbyname returns a pointer to the hostent structure described above. Otherwise, it returns a null pointer and a specific error number can be retrieved by calling WSAGetLastError."
Ich habe es jetzt so probiert:
cout << gethostbyname("www.google.de" /* Auch mit http:// */) << endl; cout << WSAGetLastError() << endl; getchar(); getchar(); /* ...WSAGetLastError sagt 0, also kein Fehler.
Und gethostbyname("www.google.de") sagt:
00C44F78Also müsste es doch eigentlich gehen?! Aber wenn ich das Programm durchlaufen lasse, dann kommt wieder Zugriffsverletzung und die Datei iosfwd öffnet sich...
@_matze: Mache ich schon die ganze Zeit, aber wo bekomme ich das denn angezeigt??
Edit: Habe jetzt grade durch Kommentare setzten herausgefunden, dass das Problem bei
addr.sin_addr = *reinterpret_cast<in_addr*>(host->h_addr);liegt.
Weis jetzt jemand was falsch ist?
-
ich hab keine ahnung, wo der fehler ist, aber es gibt hier einen artikel im forum, der genau das beschreibt.
-
Hast du einen Link?
-
-
Habe jetzt alles so geändert wie es da ist, und es geht immernoch nicht

BTW:
cout << inet_ntoa(*reinterpret_cast<in_addr*>(*host->h_addr_list));geht auch nicht...
Bitte um Hilfe!

-
Sagst du beim Arzt auch immer nur "Herr Doktor, mir geht's nicht gut!"?
-
SeppJ schrieb:
Sagst du beim Arzt auch immer nur "Herr Doktor, mir geht's nicht gut!"?
Ja, und dann verschreibt er Antibiotika und sagt ich soll die 5 mal am Tag nehmen. Wenn es mir nach 3 Wochen immernoch schlecht geht, soll ich wieder kommen. Macht man das nicht so heutzutage?

-
cooky451 schrieb:
SeppJ schrieb:
Sagst du beim Arzt auch immer nur "Herr Doktor, mir geht's nicht gut!"?
Ja, und dann verschreibt er Antibiotika und sagt ich soll die 5 mal am Tag nehmen. Wenn es mir nach 3 Wochen immernoch schlecht geht, soll ich wieder kommen. Macht man das nicht so heutzutage?

Ok. Wie lautet denn das C++-Äquivalent dieser Behandlung?
-
.. Ich weis echt nimmer weiter! Habe mich schon durch 5 Tutorials gelesen und alles durchprobiert.. Dachte Ihr hättet vllt eine Idee wie das funktionieren könnte. Aber wenn ihr nur so unnötige Sprüche auf Lager habt anstatt zu sagen was ihr noch an Infos braucht, dann hat das wohl kein Sinn -.-
-
Killur schrieb:
Aber wenn ihr nur so unnötige Sprüche auf Lager habt anstatt zu sagen was ihr noch an Infos braucht, dann hat das wohl kein Sinn -.-
Wozu sollten wir dir das noch sagen? Das steht schließlich nur in der Signatur von fast jedem Moderator, steht als "wichtig" markiert ganz oben in der Threadliste, wird in jedem 5. Thread nochmal explizit gesagt und es sollte sowieso eigentlich selbstverständlich sein, dass "geht nicht" keine brauchbare Fehlerbeschreibung ist. Ebenso wie "alles durchprobiert" und "5 Tutorials". Das sind Blenderbegriffe für politische Debatten. Versetz dich mal in jemanden, der nicht du bist und sag, ob du bei diesen Floskeln irgendeine Ahnung hast, was derjenige tatsächlich getan hat, der so etwas schreibt oder was sein Problem ist.
-
Geh mit dem Debugger durch. Der von MSVC ist super.
-
Nimm mal:
hostent* host = gethostbyname("www.google.de");
-
Weil Dus bist:
#include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <Windows.h> #include <iostream> #include <iphlpapi.h> #include <string> #pragma comment(lib, "Ws2_32.lib") using namespace std; int startWinsock(void); int main() { int rc; rc=startWinsock(); SOCKADDR_IN addr; SOCKET s=socket(AF_INET,SOCK_STREAM,0); string adress("http://www.google.de"); if(rc!=0) { cout << "Error! Starting Winsock Failed. Error-Code: "<< rc << endl; getchar(); return 1; } if(s==INVALID_SOCKET) { cout << "Creating Socket Failed!" << endl; getchar(); return 1; } memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(80); hostent* host = gethostbyname("www.google.de"); addr.sin_addr = *reinterpret_cast<in_addr*>(host->h_addr); rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { cout << "Connecting failed! Error-Code: " << WSAGetLastError() << endl; getchar(); return 1; } cout << "Verbindung hergestellt!" << endl; char bufferSend[256] = "GET / HTTP/1.0\r\n\r\n"; char bufferRecv[1024]; int sent = send(s, bufferSend, lstrlen(bufferSend), 0); cout << "Gesendet: " << sent << '\n'; rc=recv(s, bufferRecv, 1024, 0); if(rc==0) { cout << "Error!" << endl; getchar(); getchar(); exit(1); } if(rc==SOCKET_ERROR) { cout << "Fehler! - " << WSAGetLastError() << endl; getchar(); getchar(); exit(1); } cout << bufferRecv << endl; getchar(); getchar(); return 0; } int startWinsock(void) { WSADATA wsa; return WSAStartup(MAKEWORD(2,0),&wsa); }
-
Was kann man denn da genauer erklären ?! Ich weis in welcher zeile das Problem entsteht und die Fehlermeldung.
@Belli: Geht auch nicht.
-
Bei mir geht das!
-
Bei mir nicht..
Mit dem Code oben geht es bei dir?
-
Ohne error checking, sollte aber funktionieren:
hostent *he; he = gethostbyname( "www.google.de" ); sockaddr_in server; server.sin_addr.s_addr = *( ( unsigned long* ) he->h_addr );
-
Killur schrieb:
Was kann man denn da genauer erklären ?!
Du hast einiges geändert, und dann "geht es auch nicht". Dann müssen wir hier anfangen zu raten, ob denn nun der gleiche Fehler weiterbesteht oder ein völlig anderer. Zumindest diese Information könntest du uns zukommen lassen.
