400 http bad request



  • Ich habe ein client(http protokoll) problem wenn ich dass request:

    "GET /faq/index.html HTTP/1.1\r\nHost: www.kernel.org\r\n\r\n"
    

    an den Server schicke(www.kernel.de)
    Passiert erstmal ne weile garnichts und dann eine Fehlermeldung mit HTTP/1.1 400 Bad Request zurück
    Meine Frage warum und was mache ich in der Abfrage falsch?



  • Also ich habe es gerade mit netcat ausprobiert und es klappt.

    echo "GET /faq/index.html HTTP/1.1\r\nHost: www.kernel.org\r\n\r\n" | nc www.kernel.org 80
    

    Der Fehler liegt wohl wo anders.

    [Edit: Siehe unten]



  • der server gibt:

    SERVER:  HTTP/1.1 400 Bad Request
    Date: Wed, 23 Dec 2009 13:25:01 GMT
    Server: Apache/2.2
    Content-Length: 226
    Connection: close
    Content-Type: text/html; charset=iso-8859-1
    
    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>400 Bad Request</title>
    </head><body>
    <h1>Bad Request</h1>
    <p>Your browser sent a request that this server could not understand.<br />
    </p>
    </body></html>
    

    aus



  • Sekunde. Du sendest die Anfrage mit host www.kernel**.org** an www.kernel**.de**? Könnte es das sein?



  • sry hab mich verschrieb eigentlich miene ich Kernel.org habs nochmal probiert dassselbe also mein code ist eigentlich recht einfach habe eine dll:

    clienta.client_send("GET /faq/index.html HTTP/1.1\r\nHost: www.kernel.org\r\n\r\n");
    

    und in der steht bloß,send und die Parameter dazu



  • hab es 1:1 aus nem tutorial auf c-pluplus.de übernommen also die Abfrage^^
    sry für Doppelpost



  • benutzt du in client_send sizeof statt strlen?



  • ich benutze strlen(Text) und beim letzten Parammeter von send() habe ich 0

    man kann dass programm auich als POP3 client nehmen und da funktioniert alles wunderbar



  • gib mal kompletten quelltext. würde es dir dann herausfinden.



  • ^boah aber er is lang 😃
    PROGRAMM:

    #include <windows.h>
    #include "resource.h"
    #include "main.h"
    #define WM_SOCKET (WM_USER +1)
    
    BOOL bChecked1 = FALSE;
    BOOL bChecked2 = FALSE;
    BOOL bRadio1   = FALSE;
    BOOL bRadio2   = FALSE;
    BOOL bRadio3   = FALSE;
    
    static bool bfile;
    static int icport;
    static client clienta;
    static char*cip=(char*)malloc(sizeof(char)*100);
    
    FILE*f;
        char*text=(char*)malloc(sizeof(char)*100000);
        char*buffer=(char*)malloc(sizeof(char)*400);
        char*request=(char*)malloc(sizeof(char)*502);
        bool a;
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK abschicken(HWND, UINT, WPARAM, LPARAM);
    LRESULT CALLBACK cconnect(HWND, UINT, WPARAM, LPARAM);
    
    char* alloc(char* sstring,int lenght);
    
    HWND hwndw;
    HINSTANCE hInst;
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "Server Client";
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR lpszArgument,
                         int nCmdShow)
    {
       HWND hwnd;           /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName =MAKEINTRESOURCE(IDR_MENU1);                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default colour as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Server Client",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nCmdShow);
        hwndw=hwnd;
    hInst=hThisInstance;
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_COMMAND:
            {
                switch(LOWORD(wParam))
                {
    
                    case ID_CONNECT:
                    {
                        DialogBox( hInst,MAKEINTRESOURCE(IDR_CONNECT),hwnd,(DLGPROC)cconnect );
                        return 0;
                    }
                    case ID_CLOSE:
                    {
                        SendMessage(hwnd,WM_QUIT,0,0);
                        return 0;
                    }
                    case ID_INFO:
                    {
                        MessageBox(hwnd,"Die ist ein Client-Programm um jede Art von Server anzusteuern\n produced by KLG71","INFO",MB_OK);
                        return 0;
                    }
                    case ID_HELP:
                    {
                        ShellExecute(0, "open","help.txt", 0, 0, SW_SHOWNORMAL);
                        return 0;
                    }
                }
    
            }
    
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    LRESULT CALLBACK abschicken (HWND hwnd1, UINT message1, WPARAM wParam, LPARAM lParam)
    {
    
        switch (message1)                  /* handle the messages */
        {
            case WM_CLOSE:
            {
                SetDlgItemText(hwnd1,IDC_RECV,"");
                SetDlgItemText(hwnd1,IDC_EDIT1,"");
                strcpy(text,"");
                strcpy(buffer,"");
                buffer[0]='\0';
                EndDialog( hwnd1, 0);
    
                 break;
            }
            case  WM_INITDIALOG:
            {
    
                char*errstr=(char*)malloc(sizeof(char)*40);
    
                a=1;
    
                f=fopen("debug.txt","w+");
    
                SetDlgItemText(hwnd1,IDC_RECV,"");
                SetDlgItemText(hwnd1,IDC_EDIT1,"");
    
                clienta.start_init(1,399,icport,cip);
    
                int err;
    
                SOCKET s1=clienta.client_connect();
                err=GetLastError();
                if((err)>0)
                {
                sprintf(errstr,"connect failed err: %d",err);
                MessageBox(hwnd1,errstr,"Err",MB_OK);
                }
                int rc=WSAAsyncSelect(s1,hwnd1,WM_SOCKET,FD_CONNECT|FD_READ|FD_CLOSE|FD_ACCEPT);
                rc=GetLastError();
                if(rc)
                {
                sprintf(errstr,"Fehler Nummer: %d",rc);
                MessageBox(hwnd1,errstr,"Abbrechen",MB_OK);
                EndDialog(hwnd1,0);
    
                }
                clienta.client_send("GET /faq/index.html HTTP/1.1\r\nHost: www.kernel.org\r\n\r\n");
    
                break;
            }
            case WM_SOCKET:
            {
                 switch(LOWORD(lParam))
                {
                    case FD_READ:
                    {
                        sprintf(buffer,"");
                        clienta.client_recv(buffer);
    
                        if(a)
                        {
                        sprintf(text,"");
    
                        sprintf(text,"SERVER: %s",buffer);
                        a=0;
                        }
                        else
                        {
    
                        sprintf(text,"%s \r\nSERVER:  %s",text,buffer);
                        }
                        if(bfile)
                        fprintf(f,"\n\rSERVER: %s",buffer);
                        sprintf(buffer,"");
    
                        SetDlgItemText(hwnd1,IDC_RECV,text);
                         break;
                    }
                }
            }
    
            case WM_COMMAND:
            {
                if(LOWORD(wParam)==IDC_OK)
                {
                    GetDlgItemText(hwnd1,IDC_EDIT1,request,500);
                    sprintf(request,"%s\r\n",request);
                    MessageBox(hwnd1,request,"Debug",MB_OK);
                    clienta.client_send(request);
                        if(a)
                        {
                        sprintf(text,"");
    
                        sprintf(text,"USER: %s",request);
                        a=0;
                        }
                        else
                        {
    
                        sprintf(text,"%s \r\n USER: %s",text,request);
                        }
    
                    fprintf(f,"\n\r USER: %s",request);
                    sprintf(request,"");
                    SetDlgItemText(hwnd1,IDC_RECV,text);
                    SetDlgItemText(hwnd1,IDC_EDIT1,"");
    
                     break;
                }
            }
    
            default:                      /* for messages that we don't deal with */
                return false;
        }
        return 0;
    }
    
    LRESULT CALLBACK cconnect (HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
        switch (message)                  /* handle the messages */
        {
            case WM_INITDIALOG:
            {
            CheckDlgButton( hwnd2, IDC_CHECKFILE, BST_UNCHECKED );
            break;
            }
    
            case WM_CLOSE:
            {
    
                EndDialog( hwnd2, 0);
                 break;
            }
            case WM_COMMAND:
            {
                if(LOWORD(wParam)==IDC_SUBMIT1)
                {
    
                    char*cport=(char*)malloc(sizeof(char)*100);
                    bfile = (IsDlgButtonChecked
                          ( hwnd2, IDC_CHECKFILE ) == BST_CHECKED);
    
                    GetDlgItemText(hwnd2,IDC_SERV,cip,100);
                    GetDlgItemText(hwnd2,IDC_PORT,cport,100);
                    sscanf(cport,"%d",&icport);
                    EndDialog( hwnd2, 0);
                    DestroyWindow(hwnd2);
                    DialogBox( hInst,MAKEINTRESOURCE(IDR_DIALOG),hwndw,(DLGPROC)abschicken);
    
                     break;
                    }
            }
    
            default:                      /* for messages that we don't deal with */
                return false;
        }
        return 1;
    }
    
    char* alloc(char* sstring,int lenght)
    {
        char* astring=(char*)malloc(sizeof(char)*lenght);
        strcpy(astring,sstring);
        sstring=(char*)realloc(sstring,sizeof(char)*lenght),
        strcpy(sstring,astring);
    
        return sstring;
    }
    

    DLL:

    #include "main.h"
    
    int client::start_init(int cid,int blen,int cport,CHAR* cip)
    {
        ip=(char*)malloc(sizeof(char)*100);
        id=cid;lenght_buffer=blen;port=cport;sprintf(ip,"%s",cip);
    
        WSADATA wsa;
       WSAStartup(MAKEWORD(2,0),&wsa);
    
        s=socket(AF_INET,SOCK_STREAM,0);
        if(s==INVALID_SOCKET)
        return 1;
        else
        return WSAStartup(MAKEWORD(2,0),&wsa);
    }
    
    SOCKET client::client_connect(void)
    {
        memset(&addr,0,sizeof(SOCKADDR_IN));
        addr.sin_family=AF_INET;
        addr.sin_port=htons(port);
        getAddrFromString(ip,&addr);
    
        rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
        if(rc==SOCKET_ERROR)
        {
    
            return GetLastError();
        }
        else
        return s;
    }
    
    int client::client_send(CHAR* text)
    {
        send(s,text,strlen(text),0);
        return 0;
    }
    
    int client::client_recv(CHAR* buffer)
    {
        recv(s,buffer,lenght_buffer,0);
        return 0;
    }
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    
    {
    
      long rc;
    
      unsigned long ip;
    
      HOSTENT* he;
    
      /* Parameter prüfen */
    
      if(hostnameOrIp==NULL || addr==NULL)
    
        return SOCKET_ERROR;
    
      /* eine IP in hostnameOrIp ? */
    
      ip=inet_addr(hostnameOrIp);
    
      /* bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE */
    
      if(ip!=INADDR_NONE)
    
      {
    
        addr->sin_addr.s_addr=ip;
    
        return 0;
    
      }
    
      else
    
      {
    
        /* Hostname in hostnameOrIp auflösen */
    
        he=gethostbyname(hostnameOrIp);
    
        if(he==NULL)
    
        {
    
          return SOCKET_ERROR;
    
        }
    
        else
    
        {
    
          /*die 4 Bytes der IP von he nach addr kopieren */
    
          memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
    
        }
    
        return 0;
    
      }
    
    }
    

    hoffe es hilft^^



  • so kann ich es net kompilieren, da fehlt ja die hälfte. 😞

    lad es doch mal komplett irgendwo hoch mit projektdateien und so.





  • komisch, ich krieg die richtige seite und kein bad request.

    http://img692.imageshack.us/img692/3166/unbenanntrp.png



  • hmm wirklich komisch^^ lioegt wohl an meinem rechner



  • weiß jemand ob dass unter windows 7 anders läuft?



  • Wie wäre es, wenn du das Projekt irgendwo hin lädst, wo man es jetzt immernoch runter laden kann. Wird sonst ein wenig schwierig, sich das anzugucken.



  • int client::client_send(CHAR* text)
    {
        send(s,text,strlen(text),0);
        return 0;
    }
    

    Du überprüfst den Rückgabewert von send nicht!!! Wenn du mal in den Dokumentation schaust, wirst du feststellen, dass send nur so viele Zeichen sendet, wie es will. Es ist nicht gesagt, dass der komplette Puffer gesendet wird. Dies kann z.B. der Fall sein, wenn der sende Puffer im Betriebssystem voll ist. Falls nicht alles gesendet wurde, musst du ein zweites oder vielleicht auch noch ein drittes send nach schieben.



  • also 1. die Homepage ist nicht immer on weil sie sonst unmegen an rechenkapazitäten auf meinem rechner verbrauchen würde 😃

    2.Habe die Rückgabewerte überprüft es sendet genau 62 Zeichen auf einmal und mit srtlen habe ich überprüft ob dass die länge des textes ist und es stimmte über ein



  • strlen("GET /faq/index.html HTTP/1.1\r\nHost: www.kernel.org\r\n\r\n") == 54



  • kann es sein, dass bei dir \n als nur ein Buchstabe gewertet wird ubnd bei mir als 2? und dass gleiche bei \r? Oder dass das generell in der Winapi so ist?


Anmelden zum Antworten