cURL - "висящее" сокетное соединение в Linux - PullRequest
1 голос
/ 22 февраля 2010

У меня есть программа для отправки POST-запроса на сервер.
Я использую cURL для отправки запроса.
Моя программа работает на Windows и Linux (на данный момент Ubuntu 9.10).

Когда сервер получает запрос, он обрабатывает его и возвращает код ошибки (0000, если ошибок нет) и описание ошибки (если есть).
Веб-сервер сервера - Microsoft IIS.

Когда я запускаю свою программу в Windows, она работает хорошо.
Но когда я запускаю программу в Linux, она зависает на 30 секунд (тайм-аут cURL) и выдает ошибку «Тайм-аут операции через 30000 миллисекунд с 5 полученными байтами».
Как я знаю, проблема на стороне сервера - сервер не отправляет размер ответа и не закрывает сокетное соединение.

журналы cURL (из 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 журналы почти одинаковы, но без таймаута - он закрывает сокет сразу после получения «0000».

Я могу анализировать полученные данные и закрывать соединение, если получаю «0000», но это «грязный хак».

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2010

Я нашел причину проблемы.
Причина - VirtualBox.
Я использую VirtualBox для запуска Ubuntu. Если я запускаю свою программу с реального (не виртуального) ПК, она работает нормально (даже на Ubuntu). Похоже, в последней версии VirtualBox есть ошибка.

0 голосов
/ 22 февраля 2010

Ваш вопрос не раскрывает, как вы используете libcurl, поэтому ответить на него нелегко без большого количества догадок. Я также предположил бы, что некоторые из этих недостающих деталей покажут, почему приложение работает по-разному в Linux и Windows.

Ваш запрос отправляет контент длиной 244, но выводимые данные не содержат тела запроса, почему? Для меня это выглядит так, как будто сервер законно ожидает поступления этих данных, но вы их не предоставляете.

Итак, вы отправили странный запрос. Сервер отвечает странным ответом. Мусор внутри, мусор, я думаю.

...