2010-02-22 26 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