400 http bad request
-
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.
-
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 drittessend
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?
-
gibt der benutzer den request-string in ein eingabefeld ein? wenn ja müsstest du wirklich aus 2 zeichen ein zeichen machen. '\' '\n' => '\n'
falls es aber im quelltext steht wird es immer nur als 1 zeichen gezählt. auf jeder plattform.
-
also der Benutzer kann es eingeben aber ist dass nicht eigentlich egal weil bei -.- hats doch auch funktioniert
-
klg71 schrieb:
also der Benutzer kann es eingeben aber ist dass nicht eigentlich egal weil bei -.- hats doch auch funktioniert
Wie gibt er es denn ein? Wenn du eine Benutzereingabe hast, werden die Zeichen darin natürlich nicht escapet.
-
er gibt es in ein Editfeld ein muessen die Zeichen denn unbedingt escapet werden?
-
klg71 schrieb:
er gibt es in ein Editfeld ein muessen die Zeichen denn unbedingt escapet werden?
Ja natürlich! Sonst sendest du mit einem "\n" kein Neue-Zeile-Zeichen, sondern ein Backslash- gefolgt von einem "n"-Zeichen. Das mag der HTTP-Server natürlich garnicht.