curl_global_init()和curl_global_cleanup()。這兩個函式並不是執行緒安全的。所以只能在主線程中進行一次的初始化和清除。
解決辦法:
設定超時:curl_easy_setopt(curl, curlopt_timeout, 30l)
**自:
libcurl 是乙個很不錯的庫,支援http,ftp等很多的協議。使用庫最大的心得就是,不仔細看文件,僅僅看著例子就寫程式,是一件危險的事情。我的程式崩潰了,我懷疑是自己**寫的問題,後來發現是庫沒用對。不仔細看文件(有時候文件本身也比較差勁,這時除了看仔細外,還要多動腦子,考慮它是怎麼實現的),後果很嚴重。不加思索的使用別人的庫或者**,有時候很愜意,但是出問題時,卻是寢食難安的。
curlcode curl_global_init(long flags); 在多執行緒應用中,需要在主線程中呼叫這個函式。這個函式設定libcurl所需的環境。通常情況,如果不顯式的呼叫它,第一次呼叫curl_easy_init()時,curl_easy_init 會呼叫 curl_global_init,在單執行緒環境下,這不是問題。但是多執行緒下就不行了,因為curl_global_init不是執行緒安全的。在多個執行緒中呼叫curl_easy_int,然後如果兩個執行緒同時發現curl_global_init還沒有被呼叫,同時呼叫curl_global_init,悲劇就發生了。這種情況發生的概率很小,但可能性是存在的。
libcurl 有個很好的特性,它甚至可以控制網域名稱解析的超時。但是在預設情況下,它是使用alarm + siglongjmp 實現的。用alarm在多執行緒下做超時,本身就幾乎不可能。如果只是使用alarm,並不會導致程式崩潰,但是,再加上siglongjmp,就要命了(程式崩潰的很可怕,core中幾乎看不出有用資訊),因為其需要乙個sigjmp_buf型的全域性變數,多執行緒修改它。(通常情況下,可以每個執行緒乙個 sigjmp_buf 型的變數,這種情況下,多執行緒中使用 siglongjmp 是沒有問題的,但是libcurl只有乙個全域性變數,所有的執行緒都會用)。
具體是類似 curl_easy_setopt(curl, curlopt_timeout, 30l) 的超時設定,導致alarm的使用(估計發生在網域名稱解析階段),如前所述,這在多執行緒中是不行的。解決方式是禁用掉alarm這種超時, curl_easy_setopt(curl, curlopt_nosignal, 1l)。
這樣,多執行緒中使用超時就安全了。但是網域名稱解析就沒了超時機制,碰到很慢的網域名稱解析,也很麻煩。文件的建議是 consider building libcurl with c-ares support to enable asynchronous dns lookups, which enables nice timeouts for name resolves without signals. c-ares 是非同步的 dns 解決方案。
libcurl庫的簡單使用
include include include include include include pragma comment lib,ws2 32.lib pragma comment lib,wldap32.lib ifdef debug pragma comment lib,libcurld.l...
C語言LIBCURL庫使用注意事項
這裡乙個j a程式設計師進行c 開發使用libcurl踩過的坑 1.傳送指定請求型別body,比較通用方法如下,可以直接填寫資料並手動指定content type,如果是form表單等形式,則需要參考curl formadd方法 2.響應結果包含了響應行和頭域資訊 curl easy setopt ...
libcurl使用注意
libcurl使用注意 注意點1 現象 http短連線超過一定次數後一直返回錯誤7,即curle couldnt connect 過程有列印 immediate connect fail for 114.116.228.34 too many open files 使用netstat檢視發現有大量的...