Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » client/server, http

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.02.2004, 11:37 Uhr
~(un)wissender
Gast


Hm, da ja zwei Programme beteiligt sind(client und server): erlaubt Windows überhaupt standardmäßig, dass ein Programm die Antwort auf eine Anfrage, die ein anderes Programme absetzt hat, abfängt?
Wenn nein, muss ich ja entweder Threads nutzen oder die Sockets asynchron machen, damit ich das ganz in einem Programmen machen kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.02.2004, 13:20 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


listen ist nicht blockend, also musste um den accept-recv-block ne while schleife machen und z.b per _ioctl abfragen ob eine verbindung da ist (siehe div. andere Beispiele hier auf der Seite)

Außerdem musst du entweder

GET www.fun-soft.de/verzeichnis/datei.endung ...

oder

GET /verzeichnis/datei.endung ...

schreiben!

GET www.fun-soft.de/verzeichnis/datei.endung ...

liefert dir einen 404
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: