2012-10-27 14 views
7

Pisałem prosty serwer WWW (http 1.0) dla klasy, ale gdy próbuję uzyskać plik (wget 127.0.0.1 /filename) jest krótki kilka bajtów. Mylące jest to, że kiedy sumuję liczbę wysłanych bajtów, dopasowuje się do rozmiaru pliku, ale nie otrzymuje kwoty wget.Proste Http Uzyskaj odpowiedź

Dlaczego wget nie otrzymuje wszystkich danych, które zapisuję w gnieździe?

niektóre wget wyjście

wget: 

    --2012-10-27 19:02:00-- (try: 4) http://127.0.0.1:5555/ 
    Connecting to 127.0.0.1:5555... connected. 
    HTTP request sent, awaiting response... 200 Document follows 
    Length: 5777 (5.6K) [text/html] 
    Saving to: `index.html.6' 

    99% [=====================================> ] 5,776  --.-K/s in 0s  

    2012-10-27 19:02:00 (322 MB/s) - Read error at byte 5776/5777 (Connection reset by peer). Retrying. 


    --2012-10-27 19:03:52-- (try: 4) http://127.0.0.1:5555/ZoEY8.jpg 
    Connecting to 127.0.0.1:5555... connected. 
    HTTP request sent, awaiting response... 200 Document follows 
    Length: 163972 (160K) [image/jpeg] 
    Saving to: `ZoEY8.jpg.4' 

    91% [==================================> ] 149,449  --.-K/s in 0.001s 

    2012-10-27 19:03:52 (98.8 MB/s) - Read error at byte 163917/163972 (Connection reset by peer). Retrying. 

metody GET:

void * 
processGetRequest(requestParser request) 
{ 

    string resp= "HTTP/1.0 200 Document follows\r\nServer: lab5 \r\nContent-Length: "; 
    string path=""; 
    path =request.path; 

    //find file 
    int page= open (path.c_str(),O_RDONLY); 
    FILE * pageF= fdopen(page,"rb"); 


    //get size 
    fseek(pageF, 0L, SEEK_END); 
    int sz = ftell(pageF); 
    fseek(pageF, 0L, SEEK_SET); 

    //form content length 
    stringstream ss; 
    ss<<resp<<sz<<"\r\n"; 
    resp=ss.str(); 

    //make response 
    if(page<0){ 
     cout<<"404 \n"; 
    resp = "HTTP/1.0 404 File Not Found\r\nServer: lab5 \r\nContent-type: text/html \r\n \r\n"; 

    write(request.fd, resp.c_str(), resp.length()); 

    return 0; 
    } 
    if(path.find(".gif")!=string::npos) 
    resp += "Content-type: image/gif\r\n \r\n"; 
    else if(path.find(".png")!=string::npos) 
    resp += "Content-type: image/png\r\n \r\n"; 
    else if(path.find(".jpg")!=string::npos) 
    resp += "Content-type: image/jpeg\r\n \r\n"; 
    else 
    resp += "Content-type: text/html \r\n \r\n"; 

    //write response 
    write(request.fd, resp.c_str(), resp.length()); 

    int total=0;  
    char buff[1024]; 
    int readBytes = 0; 
    int er; 

    //send file 
    do{ 

    readBytes= read(page, buff, 1024); 
    cout<<"read bytes "<<readBytes<<"\n"; 

    if(readBytes<0){ 
    perror("read"); 

    break; 
    } 
    total+=readBytes; 
    er= send(request.fd, buff, readBytes,0); 
    cout<<"sent bytes "<<er<<"\n"; 
    if (er==-1){ 
    perror("send"); 
    } 
    else if(er != readBytes){ 
    cout<<"Read write miss match\n"; 
    } 

}while(readBytes>0); 

close(page); 
return 0; 
} 

Edit:

pracuję w tej chwili, a ja zastanawiałem się, czy robię moje gniazdek niewłaściwych

// Set the IP address and port for this server 
struct sockaddr_in serverIPAddress; 
memset(&serverIPAddress, 0, sizeof(serverIPAddress)); 
serverIPAddress.sin_family = AF_INET; 
serverIPAddress.sin_addr.s_addr = INADDR_ANY; 
serverIPAddress.sin_port = htons((u_short) port); 

// Allocate a socket 
int masterSocket = socket(PF_INET, SOCK_STREAM, 0); 
if (masterSocket < 0) { 
    perror("socket"); 
    exit(-1); 
} 

while (1) { 

// Accept incoming connections 
struct sockaddr_in clientIPAddress; 
int alen = sizeof(clientIPAddress); 
int slaveSocket = accept(masterSocket, 
       (struct sockaddr *)&clientIPAddress, 
       (socklen_t*)&alen); 
// send slaveSocket to get method 
} 

Odpowiedz

1

Moja pierwsza odpowiedź jest poniżej, ale ja zauważyłem coś ..

"Content-type: text/html \r\n \r\n"; 

Nagłówki muszą być oddzielone od treści z dwoma CR/LF. Wygląda jak masz miejsce tam

można spróbować to:

"Content-type: text/html\r\n\r\n"; 

Czy bufor wyjściowy jest zaczerwieniona i prawidłowo zamknięte po ostatnim zapisie? Spróbuj zmienić rozmiar bufora odczytu 1024 bajtów na coś większego niż plik gif. To nie jest poprawka, ale możesz uzyskać różne wyniki, a to może pomóc w ustaleniu przyczyny problemu. Może również umieścić trochę logowania w pętli do odczytu. Sprawdź, czy rozmiar ostatniego zapisu bufora jest równy liczbie bajtów, których brakuje w odpowiedzi.

+0

Dzięki, faktycznie było to miejsce w nagłówku – JacksonReed

Powiązane problemy