[Winsock] - Problem mit HTTP Header
-
#include <winsock.h> #include <stdio.h> int main() { // private WSADATA wsa; struct sockaddr_in addr; int sockClient; char szHost[]="www.c-plusplus.net"; char szFilename[]="forumstart.html"; char szSavename[]="seite.html"; char szUrl[MAX_PATH]; char *szBuffer; IN_ADDR *addrServer; HOSTENT *heHost; int iBytes=0; FILE *hFile; const int iBufferSize=1024; // allocate szBuffer = new char[iBufferSize]; // get url if(strlen(szFilename)>0) wsprintf(szUrl, "http://%s/%s", szHost, szFilename); else wsprintf(szUrl, "http://%s/%s", szHost, "index.htm"); MessageBox(0, szUrl, 0, 0); // setup sockets if (WSAStartup(MAKEWORD(1, 1), &wsa)){ printf("WSAStartup() error"); fflush(stdin); getchar(); return 0; } printf("WSAStartup() successful\n"); // resolve hostname heHost = gethostbyname(szHost); addrServer = (IN_ADDR*) heHost->h_addr_list[0]; // socket sockClient = socket(AF_INET, SOCK_STREAM, 0); CopyMemory(&addr.sin_addr, heHost->h_addr_list[0], sizeof (addr.sin_addr)); addr.sin_port = htons(80); addr.sin_family = AF_INET; if(sockClient==-1){ printf("socket failure\n"); fflush(stdin); getchar(); return 0; } printf("socket created successful\n"); // connect if(connect(sockClient, (struct sockaddr *)&addr, sizeof(addr)) == -1){ printf("connect() failed"); fflush(stdin); getchar(); return 0; } printf("connected to %s\n", inet_ntoa(addr.sin_addr)); // create file hFile = fopen(szSavename, "w+"); if(hFile==NULL) printf("could not create file\n"); // prepare header wsprintf(szBuffer, "GET %s HTTP/1.1\r\n", szUrl); wsprintf(szBuffer, "%sAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n", szBuffer); wsprintf(szBuffer, "%sAccept-Language: de\r\n", szBuffer); wsprintf(szBuffer, "%sAccept-Encoding: gzip, deflate\r\n", szBuffer); wsprintf(szBuffer, "%sUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n", szBuffer); wsprintf(szBuffer, "%sHost: %s\r\n", szBuffer, szHost); wsprintf(szBuffer, "%sConnection: Keep-Alive\r\n", szBuffer); MessageBox(0, szBuffer, 0, 0); // send buffer send(sockClient, szBuffer, strlen(szBuffer), 0); // recv while(iBytes=recv(sockClient, szBuffer, iBufferSize, 0)){ if(iBytes!=0) szBuffer[iBytes]=0; printf("%s", szBuffer); fprintf(hFile, "%s", szBuffer); } // cleanup delete[] szBuffer; fclose(hFile); closesocket(sockClient); return 0; }
Bei der while-Schleife hängt sich das Prog auf, was ist falsch?
Wenn ich aber nur "Get %ADRESSE" nehme dann geht escu para
-
@paranoiac.org
Ich würde mal denken, das der szBuffer überansprucht wird, da 1024 vielleicht doch zu wenig sind.MfG Unwissender
-
Original erstellt von Unwissender:
**@paranoiac.org
Ich würde mal denken, das der szBuffer überansprucht wird, da 1024 vielleicht doch zu wenig sind.MfG Unwissender :)**
Wieso sollte es den zu wenig sein.
Es geht doch wenn ich nur GET nehme. Aber ich möchte einen kompletten Header mitsenden.
-
Ich würd iBytes nach dem recv auf jeden Fall noch auf SOCKET_ERROR also -1 prüfen.
EDIT:
Daran liegts aber nicht sondern das du _zwei_ mal am ende deiner anfrage \r\n senden musst, sonst wartet der server auf weitere zeichen und sendet dir nichts, deswegen hängts dann auch beim recv da das ja ein blocking call ist.[ Dieser Beitrag wurde am 18.01.2003 um 16:08 Uhr von blackdeath editiert. ]
-
Achso.
Soll ich dann alle "\r\n" weglassen bis auf das letzte??
-
So wie ich das verstanden habe sollst bzw. musst du einfach am Ende nochmal ein zweites \r\n senden
[ Dieser Beitrag wurde am 18.01.2003 um 20:00 Uhr von flenders editiert. ]