2012-10-27 10 views
7

Bir sınıf için basit bir web sunucusu (http 1.0) yazıyorum, ancak bir dosya (wget 127.0.0.1 /filename) almayı denediğimde kısa bir kaç bayt. Kafa karıştırıcı olan şey, gönderilen bayt sayısını dosya boyutuyla eşleştiğimde, ancak wget miktarını almaz.Simple Http Yanıt

Neden wget tüm verileri almıyor sokete yazıyorum?

bazı wget çıkış

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. 

Get yöntemi:

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; 
} 

Düzenleme: Bu süre görev yapmaktayım ve Im

yanlış benim yuvalarını yapıyor merak ediyorum

// 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 
} 

cevap

1

Benim ilk cevap aşağıda, ama ben sadece bir şey fark ..

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

başlıkları iki CR/LF ile içerikten ayrılmalıdır. Eğer boşluk var gibi görünüyor orada

bu deneyebilirsiniz:

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

çıkış tamponu doğru kızardı olma ve son yazma sonra kapalı mı? 1024 byte okuma arabelleğinizin boyutunu gif dosyanızdan daha büyük bir şeye değiştirmeyi deneyin. Bu bir düzeltme değil, ancak farklı sonuçlar alabilirsiniz ve bu sorunun nedenini çözmenize yardımcı olabilir. Belki de okuma yazma döngüsüne bazı girişler koydum. Son arabellek yazısının boyutunun yanıtın eksik olduğu bayt sayısına eşit olup olmadığını görün.

+0

Teşekkürler, aslında başlıktaki boşluktu – JacksonReed