2012-10-27 25 views
7

मैं कक्षा के लिए एक साधारण वेब सर्वर (http 1.0) लिख रहा हूं, लेकिन जब भी मैं फ़ाइल प्राप्त करने का प्रयास करता हूं (wget 127.0.0.1 /filename) कुछ बाइट्स कम है। भ्रमित बात यह है कि जब मैं भेजे गए बाइट्स की संख्या को जोड़ता हूं तो यह फ़ाइल आकार से मेल खाता है, लेकिन wget राशि प्राप्त नहीं करता है।सरल एचटीपी प्रतिक्रिया प्राप्त करें

wget क्यों है जो मैं सॉकेट में लिखने वाले सभी डेटा नहीं प्राप्त कर रहा हूं?

कुछ wget उत्पादन

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. 

प्राप्त विधि:

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

संपादित करें:

मैं इस जबकि कम से काम कर रहा है और अगर मैं मेरी सॉकेट गलत

कर मैं सोच रहा हूँ
// 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 
} 

उत्तर

1

मेरा पहला जवाब से नीचे है, लेकिन मैं अभी-अभी कुछ देखा ..

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

हेडर दो CR/वामो के साथ सामग्री से अलग किया जाना चाहिए। ऐसा लगता है कि आप में जगह है वहाँ

आप इस कोशिश कर सकते हैं:

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

उत्पादन बफर सही ढंग से प्लावित किया जा रहा है और पिछले लिखने के बाद बंद कर दिया है? अपने gif फ़ाइल से बड़ा कुछ करने के लिए अपने 1024 बाइट रीड बफर के आकार को बदलने का प्रयास करें। यह एक फिक्स नहीं है, लेकिन आपको अलग-अलग परिणाम मिल सकते हैं, और इससे समस्या के कारण को ट्रैक करने में मदद मिल सकती है। हो सकता है कि कुछ लिखने को लूप लिखने में भी डाल दें। देखें कि आखिरी बफर लिखने का आकार बाइट्स की संख्या के बराबर है, जिसमें प्रतिक्रिया गुम है।

+0

धन्यवाद, यह वास्तव में हेडर में स्थान था – JacksonReed