2013-06-29 7 views
7

Używam libcurl do wysłania polecenia API do usługi lokalnej (tj. Na 127.0.0.1).libcurl opóźnienia na 1 sekundę przed przesłaniem danych, curl wiersza polecenia nie jest

Program ma na celu zastąpienie skrypt (który używa programu curl).

Wszystko działa, chyba że występuje opóźnienie 1 sekundy gdzieś, czyli 1 sekunda upłynie od chwili wzywam curl_easy_perform() do kiedy pierwsza funkcja wywołania zwrotnego jest wywoływana.

Program

C korzysta z tych opcji (sprawdzanie błędów & kod oddzwonienia pominięta):

curl_easy_setopt(curl, CURLOPT_URL, "http://127.0.0.1:12345/x"); 
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1); 
curl_easy_setopt(curl, CURLOPT_INFILESIZE, (long)getLengthOfCommandObject()); 
curl_easy_setopt(curl, CURLOPT_READFUNCTION, &myReadFunction); 
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &myWriteFunction); 

Ale jeśli uruchomię curl z powłoki jak ten:

$ curl --data-binary '<command>' http://127.0.0.1:12345/x 

natychmiast wysyła żądanie , bez cierpienia z 1-sekundowym opóźnieniem.

Co może być przyczyną opóźnienia i czy istnieje opcja, którą można ustawić, aby temu zapobiec?


Edit Serwer oparty jest na mongoose

+1

Próbowałaś wykonujący swój binarnych z _strace_? może pokazać jakiekolwiek opóźnienie podczas wykonywania programu. Strona man strace ma wiele opcji związanych z czasem. – VoidPointer

+0

@VoidPointer, strace nie wyjawił nic istotnego, ale znalazłem przyczynę. Zobacz moją odpowiedź. – finnw

Odpowiedz

11

Powodem opóźnienia był:

Rozwiązanie po stronie klienta jest wyłączenie nagłówka Expect tak:

headers = curl_slist_append(NULL, "Expect:"); 
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); 
// ... 
result = curl_easy_perform(curl); 
curl_slist_free_all(headers); 

Equivalent fix for PHP client i related PHP question

+0

Mam ten sam problem. Ta odpowiedź naprawdę ratuje mi dzień !!!! – Tranz

Powiązane problemy