2010-02-22 62 views
1

我有一個程序向服務器發送POST請求。
我使用cURL發送請求。
我的程序運行在Windows和Linux(Ubuntu 9.10)。cURL - 在Linux上「懸掛」套接字連接

當服務器接收到請求時,它會處理它並返回錯誤代碼(如果沒有錯誤,則返回0000)和錯誤描述(如果有的話)。
服務器的Web服務器是Microsoft IIS。

當我在Windows上運行我的程序時效果很好。
但是,當我在Linux上運行該程序時,它掛起了30秒(cURL的超時)並返回錯誤「操作超過30000毫秒後收到5個字節超時」。
因爲我知道在服務器端的問題 - 服務器不發送響應的大小,並沒有關閉套接字連接。

捲曲日誌(在Linux):


11:00:09.544 Process()  curl: libcurl/7.19.5 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.15 
11:00:09.941 DebugCallback() About to connect() to sms1.redoxygen.net port 80 (#0) 
11:00:09.941 DebugCallback() Trying 203.145.62.146... 
11:00:10.084 DebugCallback() Connected to sms1.redoxygen.net (203.145.62.146) port 80 (#0) 
11:00:10.085 DebugCallback() POST /sms.dll?private&type=26 HTTP/1.1 
           Host: sms1.redoxygen.net 
           Content-Length: 244 
11:00:10.086 DebugCallback() [244 bytes of DATA] 
11:00:10.087 ReadCallback() No more data to send 
11:00:10.292 WriteCallback() HTTP/1.1 200 OK 
11:00:10.293 DebugCallback() Content-Type: text/html 
11:00:10.294 DebugCallback() no chunk, no close, no size. Assume close to signal end 
11:00:10.294 WriteCallback() 
11:00:10.466 DebugCallback() 0000 
11:00:40.500 DebugCallback() Operation timed out after 30000 milliseconds with 5 bytes received 
11:00:40.501 DebugCallback() Closing connection #0 

在Windows日誌幾乎是相同的,但沒有超時 - 它關閉套接字後立即reciving 「0000」。

我可以分析收到的數據並關閉連接,如果我得到「0000」,但它是一個「骯髒的黑客」。

任何想法?

+0

你沒有提到爲什麼你必須支持像這樣的非法HTTP響應?爲什麼不修復服務器以返回有效的響應? – EricLaw 2010-02-22 02:23:57

+0

@EricLaw-MSFT:好點,但我不能改變服務器的實現。 我不明白爲什麼它在Windows上工作得很好。可能是國際空間站發送一些額外的信息? – Dmitriy 2010-02-22 04:29:37

+0

當您通過telnet/netcat執行請求時是否發生同樣的事情? – jdizzle 2010-02-22 23:02:50

回答

0

我找到了問題的原因。
原因是 - VirtualBox。
我正在使用VirtualBox運行Ubuntu。如果我從真實(而不是虛擬)PC運行我的程序,它工作正常(甚至在Ubuntu上)。 看起來像最新版本的VirtualBox中存在一個錯誤。

0

你的問題並不能揭示你如何使用libcurl,因此如果沒有大量的猜測就很難準確回答。我還會假設其中一些缺失的細節將揭示爲什麼該應用程序在Linux和Windows上的工作方式不同。

您的請求發送的內容長度爲244,但您顯示的輸出不包含任何請求主體,爲什麼?對我來說,它看起來像服務器正在等待數據到達,但你不提供它。

所以,你發送一個奇怪的請求。服務器回覆一個奇怪的響應。垃圾,垃圾,我猜。

+0

謝謝你的回答。我刪除了請求的主體,因爲它包含私人信息。我發送確切的字節數(在本例中爲244)。服務器接受請求併發回「0000」。此外,服務器處理請求正確(在這種情況下發送短信到我的手機)。但連接掛斷。 – Dmitriy 2010-02-22 22:59:44