2013-02-07 24 views
0

我的服務器套接字有問題。我正在製作一個Web服務器並嘗試從瀏覽器中填寫。表單HTML腳本如下所示:收到POST HTTP請求後'資源暫時不可用' - Python

<html> 
<body bgcolor = black text= white> 
<FORM method="post" action="/processData.py"> 
<P> 
<LABEL for="firstname">First name: </LABEL> 
<INPUT type="text" id="firstname"><BR> 

<LABEL for="lastname">Last name: </LABEL> 
<INPUT type="text" id="lastname"><BR> 

<LABEL for="email">email: </LABEL> 
<INPUT type="text" id="email"><BR> 

<INPUT type="radio" name="sex" value="Male"> Male<BR> 
<INPUT type="radio" name="sex" value="Female"> Female<BR> 

<INPUT type="submit" value="Send"> <INPUT type="reset"> 
</P> 
</FORM> 
</body> 
</html> 

我試圖打印時POST請求從瀏覽器擊中後把我的終端在整個請求「提交」。當我在Web服務器上收到POST請求時,套接字會拋出'[Errno 35]資源暫時不可用'。我不關閉連接或任何東西,但不知何故我失去了連接。這裏是我在Python中使用的代碼來獲取POST。

while not recvIsComplete: 
    rcvdStr = fd.recv(1024) 
    if rcvdStr[0:3] == "GET": 
     toGET() 

    elif rcvdStr[0:4] == "POST":  
     print rcvdStr 

任何想法是怎麼回事?

+0

我們需要了解更多關於您如何「製作Web服務器」的信息。但是,通常情況下,當您嘗試從非阻塞套接字讀取但沒有要讀取的數據時,您會得到errno 35('EAGAIN')。 (這有點令人困惑,因爲在大多數POSIX平臺上,'EWOULDBLOCK:Operation會阻止'和'EAGAIN:Resource暫時可用'是同一個errno。) – abarnert

+0

另外,我可以猜測錯誤正在'rcvdStr = fd.recv(1024)',以及回溯說的是什麼......但向我們展示是很好的,所以我們不必猜測。 – abarnert

+0

另外,您可能需要檢查「EAGAIN」和「EWOULDBLOCK」是否在您的平臺上。 (如果你在Windows上,不要試圖回答這個問題,只是說「我在Windows上」。) – abarnert

回答

0

這可能不是正確的,但它似乎最有可能根據您提供的信息:你已經寫了一個阻塞服務器可能每個客戶在自己的線程連接

(但也許使用過程中或而不是僅僅處理一個客戶端)。但是你正在使用非阻塞套接字。

詳細信息取決於您的確切代碼和平臺,但最常見的原因是您在沒有數據的非阻塞套接字上調用了recv,並且它返回EWOULDBLOCK,並且您的平臺具有相同錯誤編號爲EAGAINEWOULDBLOCK

如果是這樣,那麼簡單的答案是:不要在阻塞服務器中使用非阻塞套接字。要麼確保套接字處於阻塞模式,要麼除非您知道有數據(例如,因爲select剛告訴您),否則不要致電recv

可以處理非阻斷阻斷服務器套接字通過try荷蘭國際集團的recv和只是插座以某種方式處理EWOULDBLOCK(如select再試,或發送心跳/空閒分組進行確定對方仍然在那裏,或者其他適合你設計的東西)。但通常情況下,這不是你想要做的;你可以用settimeout做一些簡單的事情。