2013-06-29 33 views
7

Tôi đang sử dụng libcurl để gửi lệnh API đến một dịch vụ cục bộ (ví dụ: trên 127.0.0.1).libcurl trì hoãn trong 1 giây trước khi tải lên dữ liệu, dòng lệnh curl không

Chương trình được thiết kế để thay thế một kịch bản shell (có sử dụng chương trình curl.)

Tất cả mọi thứ đang làm việc, ngoại trừ có sự chậm trễ 1 giây nơi nào đó, tức là 1 giây trôi qua kể từ khi tôi gọi curl_easy_perform() khi chức năng gọi lại đọc của tôi được gọi đầu tiên.

C chương trình đang sử dụng các tùy chọn này (kiểm tra lỗi & đang gọi lại bỏ qua):

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); 

Nhưng nếu tôi chạy curl từ vỏ như thế này:

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

nó sẽ gửi yêu cầu ngay lập tức , mà không bị chậm trễ 1 giây.

Điều gì có thể gây ra sự chậm trễ và có tùy chọn nào tôi có thể đặt để ngăn chặn không?


Sửa Các máy chủ dựa trên mongoose

+1

Bạn đã thử thực hiện nhị phân của bạn với _strace_? nó có thể hiển thị bất kỳ sự chậm trễ nào khi thực hiện chương trình. Man page of strace có nhiều tùy chọn liên quan đến thời gian. – VoidPointer

+0

@VoidPointer, strace không tiết lộ bất cứ điều gì có liên quan, nhưng tôi tìm thấy nguyên nhân. Xem câu trả lời của tôi. – finnw

Trả lời

11

Lý do cho sự chậm trễ là:

Một giải pháp về phía khách hàng là để vô hiệu hóa các Expect tiêu đề như vậy:

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 clientrelated PHP question

+0

Tôi có cùng một vấn đề. Câu trả lời này thực sự tiết kiệm trong ngày của tôi !!!! – Tranz

Các vấn đề liên quan