2012-03-15 16 views
0

對於類,我正在編寫一個基本代理服務器。代理服務器,在發送給主機之前格式化瀏覽器請求

在教授的例子(這是JAVA),他把瀏覽器的請求時,它看起來像這樣:

GET http://www.cs.rpi.edu/index.html HTTP/1.1 
Host: www.cs.rpi.edu 
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:10.0) Gecko/20100101 Firefox/10.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip, deflate 
Proxy-Connection: keep-alive 
Cookie: __utma=138860844.163543584.1329315062.1329315062.1329315062.1;__utmz=138860844.1329315062.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided) 
Cache-Control: max-age=0 

和格式它看起來像這樣,加上接受和用戶代理頭,前它發送到主機服務器:

GET /index.html HTTP/1.1 
Host: www.cs.rpi.edu 

我所做的也是這個,但現在我碰到2個問題,和1個問題:

答消息發送給服務器還好,BEC ause connect()和write()不會給我任何錯誤,但是當我讀取()服務器響應(可能錯誤地期望HTML?)時,程序會凍結並永遠坐着直到我按Ctrl + C。我不能爲我的生活找到原因:

/* write a message out on the socket connection */ 
    int n = write(sock, clientrequest, strlen(clientrequest)); 

    if (n < strlen(clientrequest)) 
    { 
    perror("write() failed"); 
    return EXIT_FAILURE; 
    } 

    printf("Made it here.\n\n"); 

    char buffer2[1024]; 
    n = read(sock, buffer2, 1024); 
    if (n < 1) 
    { 
    perror("read() failed"); 
    return EXIT_FAILURE; 
    } 
    else 
    { 
    buffer2[n] = '\0'; 
    printf("Rcvd message from server: \n\n----\n\n%s\n\n----\n\n", buffer2); 
    } 

    printf("But not here.\n\n"); 

B.說我連接到像www.google.com這樣的東西。沒有/index.html,那麼在格式化請求中的GET之後應該怎麼辦?

C.爲什麼請求需要以這種方式進行格式化,而不是按原樣發送?

回答

1

A)你確定在修改後的clientrequest字符串的末尾有2個換行符嗎?如果沒有,那麼服務器仍然在等你發送剩餘的請求。

此外,如果第一次write()調用沒有發送所有數據,則不需要聲明失敗。你應該坐在一個循環,並繼續寫作,直到你耗盡你的緩衝區。如果出現實際錯誤,則返回-1,然後您可以聲明緊急情況。 B)只需詢問'/',如「GET/HTTP/1.1」中所述。服務器將知道該怎麼做。

C)以這種方式格式化,如只有GET和Host:線的請求?有時候,代理服務器的功能就是隱私:瀏覽器泄露了很多關於自己的信息。這個代理示例剝離了很多這些行。

+0

我甚至讀完之前,沒有2個換行符。我現在要去改變。非常感謝。我也知道,我完全忘了。 – Aerovistae 2012-03-15 04:13:59

相關問題