socket problem



  • Hi,
    ich hab ein problem mit sockets. ich hab mir ein kleiner konsolen programm geschrieben, dass mir von einem webserver eine php-datei runterlädt. das programm geht auch soweit. ich bekomme von server auch was zurück aber irgendwie kommen immer wieder zeichen, die da eigentlich nicht hingehören. ich fordere von meinem webserver die line.php die einfach nur 1000 zeilen mit einer von programm übergebenen post-variable ausgibt.

    line.php

    <?php
      for($i = 0; $i < 1000; $i++)
        echo $_POST["test"] . ":" . ($i+1) . "\n";
    ?>
    

    hier noch der code vom programm.

    main.cpp

    #include <iostream.h>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <stdlib.h>
    
    #ifdef _WIN32 // Windows System
    #include <winsock.h>
    #include <io.h>
    #endif
    
    void main() {
    	WSADATA wsaData;
    	if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0) {
    		fprintf (stderr,"WSAStartup(): Kann Winsock nicht initialisieren.\n");
    		exit (EXIT_FAILURE);
    	}
    
    	int s = socket (AF_INET,SOCK_STREAM,0);
    	if(s == -1)  {
    		cout << "Socket konnte nicht erstellt werden" << endl;
    		exit(s);
    	}
    	else
    		cout << "Socket erstellt" << endl;
    	struct sockaddr_in server_addr;
    	server_addr.sin_family = AF_INET;
    	server_addr.sin_port = htons(80); //HTTP-Port
    	server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    	if(connect(s ,(sockaddr*) &server_addr, sizeof(server_addr)) == -1) {
    		cout << "Verbindung konnte nicht erstellt werden" << endl;
    		exit(-1);
    	}
    	else
    		cout << "Connection erstellt" << endl;
        char* host = "localhost";
        char* path = "/line.php";
        char* postdata = "test=line";
    	char buffer[1024];
        sprintf(buffer, "POST %s HTTP/1.1\r\n", path);
        if(send(s, buffer, strlen(buffer), 0) == -1)
    		cout << "Fehler beim senden von:" << buffer << endl;
        sprintf(buffer, "Host: %s\n", host);
        if(send(s, buffer, strlen(buffer), 0) == -1)
    		cout << "Fehler beim senden von:" << buffer << endl;
    	sprintf(buffer, "Accept: */* \r\n");
        if(send(s, buffer, strlen(buffer), 0) == -1)
    		cout << "Fehler beim senden von:" << buffer << endl;
        sprintf(buffer, "Content-type: application/x-www-form-urlencoded\r\n");
        if(send(s, buffer, strlen(buffer), 0) == -1)
    		cout << "Fehler beim senden von:" << buffer << endl;
        sprintf(buffer, "Connection: close\r\n");
        if(send(s, buffer, strlen(buffer), 0) == -1)
    		cout << "Fehler beim senden von:" << buffer << endl;
        sprintf(buffer, "Content-length: %d\r\n\r\n", strlen(postdata));
        if(send(s, buffer, strlen(buffer), 0) == -1)
    		cout << "Fehler beim senden von:" << buffer << endl;
    	sprintf(buffer, "%s\r\n", postdata);
        if(send(s, buffer, strlen(buffer), 0) == -1)
    		cout << "Fehler beim senden von:" << buffer << endl;
    	int bytes;
    	FILE* file = fopen("line.txt","w+");
    	do {
    		bytes = recv(s,buffer,sizeof(buffer)-1,0);
    		if(bytes <= 0)
    			break;
    		else {
    			buffer[bytes++] = '\0';
    			for(int i = bytes; i < sizeof(buffer);i++)
    				buffer[i] = NULL;
    			fprintf(file,"%s",buffer);
    			cout << buffer;
    		}
    	} while(1);
    	fclose(file);
    #ifdef _WIN32
    	closesocket(s);
    	WSACleanup();
    #else
    	close(s);
    #endif
    }
    

    jetzt noch die zeichen die immer wieder zwischen dem output erscheinen

    HTTP/1.1 200 OK
    Date: Sun, 25 Apr 2004 13:26:04 GMT
    Server: Apache/1.3.29 (Win32)
    X-Powered-By: PHP/4.3.5
    Connection: close
    Transfer-Encoding: chunked
    Content-Type: text/html

    f43

    line:1
    ...
    line:446
    l

    ffb

    ine:447
    line:448
    ...
    line:900
    line:9

    37f

    01
    line:902
    ...
    line:1000

    0

    ich hab den output gekürzt, immer da wo drei punkte sind komme keine unregelmäßigkeiten vor. hat irgendjemand eine ahnung wie es zu unregelmäßig kommt? ich bin mittlerweile schon verzweifelt, da ich das ganze wochenende den fehler schon gesucht hab und ihn bis jetzt nicht gefunden hab. ich hab das gleiche auch schon mit den qsockets klassen gemacht und da tratt der gleiche fehler auf. jemand ne idee? liegt es vielleicht an meinem lokalen apache? oder ist irgendwo ein fehler den ich übersehen hab.
    ciao noppenwelle

    edit:
    am webserver liegt es nicht. hab es noch mit andere getestet und da traten die gleichen zeichen auf.



  • hab das problem behoben. musste http/1.1 in http/1.0 ändern dann tritt der fehler nicht mehr auf


Anmelden zum Antworten