000
24.02.2004, 11:29 Uhr
~(un)wissender
Gast
|
Habe mal wieder nach langer Zeit versucht mittels Server und Client eine HTTP_GET-Anfrage zustellen, klappt aber nicht! Ich starte der Server, welcher an port 80 lauscht, dann den Client, der die Anfrage sendet. Ich will hier einfach den Quellcode des Forum haben, den man sich auch ganz einfach im Browser anzeigen lassen kann. Der Server empfängt aber nicht, seht ihr den Fehler?
C++: |
#include "windows.h" #include "iostream" using namespace std;
int main(int argc, char* argv[]) { //Initialisieren WSADATA data; WSAStartup(MAKEWORD(2,0), &data);
//Den Socket erstellen SOCKET socket = ::socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); if(socket == INVALID_SOCKET) { cout << "ERROR_SOCKET!" << endl; return 0; } //Die Adresse erstellen. SOCKADDR_IN addr; addr.sin_addr.s_addr = INADDR_ANY; //Egal, wechle Adresse addr.sin_family = AF_INET; //Internet addr.sin_port = ::htons( 80 ); //Port 80 ->http //Den Socket an die Adresse binden. if(::bind(socket, (LPSOCKADDR)&addr, sizeof( SOCKADDR_IN )) == SOCKET_ERROR) { cout << "ERROR_BIND!" << endl; return 0; }
//Socket abhören if( ::listen( socket, SOMAXCONN ) == SOCKET_ERROR) { cout << "ERROR_LISTEN!" << endl; return 0; }
//Auf Daten warten... SOCKET connection = ::accept(socket, NULL, NULL); if(connection == INVALID_SOCKET || socket == INVALID_SOCKET) cout << "ERROR_ACCEPT!" << endl; char buffer[128]; int number = 0; //Solange lesen wie Daten kommen. while((number = ::recv(connection, buffer, 127, 0)) == 127) { buffer[number] = '\0'; cout << buffer << endl; } //Warten... getchar(); //Aufräumen ::closesocket(socket); ::closesocket(connection); WSACleanup(); return 0; }
|
Der Client
C++: |
#include "windows.h" #include <iostream> #include <cstdlib> #include <string> using namespace std;
int main(int argc, char* argv[]) { //Initialisieren WSADATA data; WSAStartup(MAKEWORD(2,0), &data); //Das Forum :) const string host = "www.cplusplus-forum.de"; sockaddr_in sa; hostent *hp; SOCKET socket; hp = ::gethostbyname(host.c_str()); if (hp == NULL) { cout << "Unknown host" << endl; return 0; }
//Adresse erstellen ::memset(&sa, 0, sizeof(sa)); ::memcpy((char *)&sa.sin_addr, hp->h_addr, hp->h_length); sa.sin_family = AF_INET; sa.sin_port = ::htons( 80 ); //Port 80 ->http
//Socket erstellen socket = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (socket == INVALID_SOCKET) { cout << "INVALID_SOCKET" << endl; return 0; } //Verbinden... if (::connect(socket, (struct sockaddr *)&sa, sizeof sa) == SOCKET_ERROR) { ::closesocket(socket); cout << "ERROR_CONNECT" << endl; return 0; } //Http-Anfrage, ist die korrekt? string request = "GET "; request += host; request += " http/1.0\r\n";
if(::send(socket, request.c_str(), static_cast<int>(request.size()), 0) == SOCKET_ERROR) { ::closesocket(socket); cout << "ERROR_SEND" << endl; return 0; } //Ist das korrekt, muss der hier geschlossen werden, oder übernimmt das der Server? ::closesocket(socket); return 0; }
|
|