PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] HTTP request problem ( non standard port )


ch
16.06.2005, 14:05
Hi, ich versuche grade eine datei aus dem netz runterzuladen das lappt solange ich auf dem standard port bleibe auch ganz gut nur wenn ich einen anderen Port nehme bleibt das Programm hngen ( nehme an das liegt am blocking der socks).

Hier erstmal mein Code:

static void u_GetHTTPFile(const userinput * const u){
int sock;
struct sockaddr_in host_addr;
struct hostent *hostinfo;
char *host, *file;
char command[1024];
char buf[1024];
int bytes_sent, bytes_recv;
FILE * G_Out;
host = u->arg1;
file = u->arg2;
/* Socket erzeugen */
sock = socket (AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror ("socket()");
exit (EXIT_FAILURE);
}
/* Adresse des Servers festlegen */
memset( &host_addr, 0, sizeof (host_addr));
host_addr.sin_family = AF_INET;
host_addr.sin_port = htons (3333); //mom versuche ich es auf port 3333 natuerlich luft auch ein http server dort
host_addr.sin_addr.s_addr = inet_addr (host);
if (host_addr.sin_addr.s_addr == INADDR_NONE) {
/* Server wurde nicht mit IP sondern mit dem Namen angegeben */
hostinfo = gethostbyname (host);
if (hostinfo == NULL) {
u_respond(u,"gethostbyname()");
return;
}
memcpy((char*) &host_addr.sin_addr.s_addr, hostinfo->h_addr, hostinfo->h_length);
}
/* Verbindung aufbauen */
if (connect(sock, (struct sockaddr *) &host_addr, sizeof(struct sockaddr)) == -1) {
u_respond(u,"connect()");
return;
}
/* HTTP-GET-Befehl erzeugen */
sprintf (command, "GET %s HTTP/1.0\nHost:%s\n\n",file, host);
/* Befehl senden */
bytes_sent = send (sock, command, strlen (command), 0);
if (bytes_sent == -1) {
u_respond(u,"send()");
return;
}
// Antwort des Servers empfangen und ausgeben */
G_Out = fopen("OUT.TXT","w");
while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) > 0) {
fputs(buf, G_Out);
}
fclose(G_Out);
if (bytes_recv == -1) {
u_respond(u,"recv()");
return;
}
return;
}

hab schon einige http requests versucht klappen mag leider keiner so richtig.

plz help

TIA ch


Jidder
16.06.2005, 14:44
auf den ersten blick finde ich keinen fehler im code. allerdings ist die anfrage falsch:
sprintf (command, "GET %s HTTP/1.0\nHost:%s\n\n",file, host);
die zeilenumbrche im header mssen immer \r\n sein.
die zeile muss also so lauten:
sprintf (command, "GET %s HTTP/1.0\r\nHost:%s\r\n\r\n",file, host);

ch
16.06.2005, 16:30
Danke, das scheint zu funktionieren nur ist die Datei die ich ausgebe viel kleiner als die datei die auf dem server liegt am ende steht :
rminateProcessutA

sieht aus als wrd der unterbrochen werden

ch
16.06.2005, 16:42
so sieht der nchste Versuch aus also ich hab das Gefhl das er einfach abbricht muss ich evtl sowas wie keep alive setzen?

-------------------------------------------------------------

HTTP/1.0 200 OK
Server: TinyHTTPD
Date: Thu, 16 Jun 2005 23:40:32 GMT
Content-Type: application/octet-stream
Accept-Ranges: bytes
Last-Modified: Thu, 16 Jun 2005 23:40:32 GMT
Content-Length: 61440
Connection: close
MZu#PPPPPj
h`@) (h`@) )
@@f@h@fD$ (@@f@h@fD$) <u:t RVUH@%D@t V4&@YjYE;tPY@5@_;_uC (V4&@YjYE;tPY@5@_;_uC) փ=@uju (փ=@uju) L@@ȋd$Gȋ\$T$ D$ ud$ȋD$r;T$ wr;D$v N+D$T$3+D$T$ ؃ڨtuPVu$@MLD0@ut0+] ]E%@@u@M E YY]U}o execute shell, error = %slow an argument
t get socket/O mode [used for scanning]%s] %d (%s) openon's support team for more information.
Alloc

butterkeks
16.06.2005, 17:26
while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) > 0) {
fputs(buf, G_Out);
}

ich wei net, ob es daran liegt, aber das sieht ziemlich falsch aus; Es msste in etwa so sein:

while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) > 0) {
fwrite(buf, 1, bytes_recv, G_Out);
}

fputs() schreibt Daten in die Datei, bis ein 0 byte gefunden wird.
Da die Datei grer ist, als dein Buffer, wird dieses berschrieben und es werden zu viele (oder zu wenig, wenn in der Datei selbst ein 0 byte liegt) Daten geschrieben.

Auf die SChnelle fidne ich auch nichts, was dein Problem unmittelbar heraufbeschwrt

ch
16.06.2005, 19:16
Das war mein Fehler 1a dank dir :)