2010-02-22 4 views
1

J'ai un programme pour envoyer une requête POST à ​​un serveur.
J'utilise cURL pour envoyer une requête.
Mon programme fonctionne sous Windows et Linux (en ce moment Ubuntu 9.10).cURL - connexion socket "suspendue" sous Linux

Lorsque le serveur reçoit le demande le traiter et renvoie le code d'erreur (0000 si aucune erreur) et la description de l'erreur (le cas échéant).
Le serveur Web du serveur est Microsoft IIS. Lorsque j'exécute mon programme sous Windows, cela fonctionne bien.
Mais quand j'exécute le programme sous Linux, il raccroche pendant 30 secondes (timeout de cURL) et renvoie une erreur "L'opération a expiré après 30000 millisecondes avec 5 octets reçus".
Comme je connais le problème côté serveur - le serveur n'envoie pas la taille de la réponse et ne ferme pas la connexion de socket.

journaux de Flexion (de 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 

Sur les journaux Windows sont presque les mêmes, mais sans délai - il prise immédiatement après près reciving "0000".

Je peux analyser les données reçues et fermer la connexion si j'obtiens "0000", mais c'est un "bidouillage".

Des idées?

+0

Vous n'avez pas mentionné pourquoi vous devez supporter une réponse HTTP illégale comme celle-ci? Pourquoi ne pas simplement réparer le serveur pour renvoyer une réponse valide? – EricLaw

+0

@EricLaw -MSFT: Bon point, mais je ne peux pas changer l'implémentation du serveur. Je ne comprends pas POURQUOI cela fonctionne bien chez Windows. Peut être ISS envoyer des informations supplémentaires? – Dmitriy

+0

La même chose se produit-elle lorsque vous exécutez la requête via telnet/netcat? – jdizzle

Répondre

0

J'ai trouvé la raison du problème.
La raison en est - VirtualBox.
J'utilise VirtualBox pour exécuter Ubuntu. Si je cours mon programme à partir d'un vrai PC (pas virtuel), ça marche bien (même sur Ubuntu). Il semblerait qu'il y ait un bug dans la dernière version de VirtualBox.

0

Votre question ne révèle pas comment vous utilisez libcurl, il n'est donc pas facile de répondre avec précision sans beaucoup de devinettes. Je suppose également que certains de ces détails manquants pourraient révéler pourquoi l'application fonctionne différemment sur Linux et Windows.

Votre requête envoie une longueur de contenu de 244 mais la sortie que vous montrez n'inclut aucun corps de requête, pourquoi? Pour moi, il semble que le serveur attend légitimement que ces données arrivent, mais vous ne les fournissez pas.

Donc, vous envoyez une requête étrange. Le serveur répond avec une réponse étrange. Des ordures, des ordures, je suppose.

+0

Merci pour votre réponse. J'ai supprimé le corps de la requête car il contient des informations privées. J'envoie le nombre exact d'octets (dans ce cas 244). Le serveur accepte la demande et renvoie "0000". De plus, le serveur traite correctement la demande (dans ce cas, envoie un SMS sur mon mobile). Mais la connexion raccroche. – Dmitriy