PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] HTTP-Request Probleme !



luxury11
30.11.2010, 15:39
Beschäftige mich gerade mit dem http-Request
und habe mir ein "Programm" geschrieben, das mir Probleme bereitet.

Ich sende zuerste meine Parameter an den Host
und empfange folgendes:

http://img843.imageshack.us/img843/938/picture0.gif

Statt / habe ich auch index.html und index.php genommen und bei anderen hosts versucht.

Hier der aktuelle Text.




#pragma comment( lib, "ws2_32.lib" )

#include <stdio.h>
#include <Windows.h>
#include <WinSock.h>
#include <string.h>

#define MAX_BUF 4096

int main(int argc, char *argv[])
{
char httpRequest[MAX_BUF] = {0};
char httpParameter[] = "GET / HTTP/1.0\r\n";
char httpHost[] = "Host: www.twitter.com\r\n";
char httpSub[] = "\r\n";
char httpResponse[MAX_BUF] = {0};
char httpBuffer[MAX_BUF] = {0};
char *httpAddr = "128.242.250.148";
int httpLength = MAX_BUF;
int httpPort = 80;
struct sockaddr_in serveraddr;
SOCKET sock;
WSADATA wsaData;

strncat(httpRequest,httpParameter,strlen(httpParam eter));
strncat(httpRequest,httpHost,strlen(httpHost));
strncat(httpRequest,httpSub,strlen(httpSub));
printf("%s\n",httpRequest);

if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
{
return 1;
}
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
return 2;
}

memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(httpAddr);
serveraddr.sin_port = htons((unsigned short) httpPort);

if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
{
return 3;
}
if (send(sock, httpRequest, strlen(httpRequest), 0) != strlen(httpRequest))
{
return 4;
}

while (httpLength == MAX_BUF)
{
httpLength= recv(sock, (char*)&httpBuffer, MAX_BUF, 0);
if (httpLength>0)
{
strncat(httpResponse, httpBuffer, httpLength);
}
}

printf("%s",httpResponse);

Sleep(20000);
return 0;
}

blackberry
30.11.2010, 16:22
Machs mal so:
char httpHost[] = "Host: twitter.com\r\n";
(kein "www.")

Das Moved Permanently wird benutzt um den Browser umzuleiten; scheinbar will Twitter dich auf Twitter.com und nicht auf www.Twitter.com (http://www.Twitter.com) haben (merkt man auch sofort, wenn man das in Firefox eingibt; man landet immer auf Twitter.com, ohne www.) (http://www.%29).

Siehe auch: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

EDIT: Apropos: kleiner Verbesserungsvorschlag:
http://msdn.microsoft.com/en-us/library/ms738524%28VS.85%29.aspx benutzen; dann musst du die IP nicht hard-coden. Programmbeispiel ist auf MSDN mit dabei.

luxury11
30.11.2010, 16:57
Funktioniert :)
Aber leider lädt der nicht den ganzen Request.
MAX_BUF habe ich beliebig erhöht, ohne Änderung.

Ich hab den Text mal in einer Textdatei speichern lassen.
Nopaste.me (http://nopaste.me/paste/4cf52caf2e8b4.html)

Das Programm lädt nur bis <title>

Dj Hackmaster A
30.11.2010, 16:59
Man empfängt bis recv() 0 oder -1 zurückgibt. Auf den Bufferoverflow muss ich wohl nicht hinweisen?
Übrigens: Wenn du ein char-array als buffer nutzt, dann zeigt &array[0] zwar auf das erste Element, &array aber nicht.

luxury11
01.12.2010, 16:04
Habs mal geändert und es läuft. Ich hoffe mal der Buffing overfl0w is auch gefixt mit httpLength+strlen(httpResponse) <= MAX_BUF.




#pragma comment( lib, "ws2_32.lib" )

#include <stdio.h>
#include <Windows.h>
#include <WinSock.h>
#include <string.h>

#define MAX_BUF 32766

int main(int argc, char *argv[])
{
char httpRequest[MAX_BUF] = {0};
char httpParameter[] = "GET /index.php HTTP/1.0\r\nHost:";
char httpHost[] = "twitter.com";
char httpSub[] = "\r\n";
char httpResponse[MAX_BUF] = {0};
char httpBuffer[MAX_BUF] = {0};
char *httpAddr;
int httpLength = MAX_BUF;
int httpPort = 80;
struct sockaddr_in serveraddr;
SOCKET sock;
WSADATA wsaData;
PHOSTENT remoteHost;

strncat(httpRequest,httpParameter,strlen(httpParam eter));
strncat(httpRequest,httpHost,strlen(httpHost));
strncat(httpRequest,httpSub,strlen(httpSub));
strncat(httpRequest,httpSub,strlen(httpSub));

if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
{
return 1;
}
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
{
return 2;
}

remoteHost = gethostbyname(httpHost);
if(remoteHost == NULL)
{
return 3;
}
httpAddr = inet_ntoa (*(struct in_addr *)*remoteHost->h_addr_list);

memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr((const char*)httpAddr);
serveraddr.sin_port = htons((unsigned short) httpPort);

if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0)
{
return 4;
}
if (send(sock, httpRequest, strlen(httpRequest), 0) != strlen(httpRequest))
{
return 5;
}

do
{
httpLength = recv(sock, httpBuffer, MAX_BUF, 0);
if ( httpLength > 0 && (httpLength+strlen(httpResponse) <= MAX_BUF))
{
strncat(httpResponse, httpBuffer, httpLength);
}
else if( httpLength == 0 )
{
}
else
{
return 6;
}

}
while( httpLength > 0 );

printf("%s",httpResponse);
Sleep(20000);

return 0;
}