2015-09-01 30 views
8

Belirli aralıklarla birkaç web sayfasını kazıyan kişisel kullanım için bir program üzerinde çalışıyorum. Bunlardan biri SSL kullanımını gerektiriyor ve ana URL'si aslında her seferinde bir avuç dolusu listeden farklı bir alana yönlendiren bir yük dengeleyicidir (ilgili olup olmadığından emin değil). Özellikle libcurl ve SSL için oldukça yeni, bu yüzden bariz bir şeyi kaçırıyor olabilirim ama sanmıyorum.Libcurl çalışmayı durdurdu, SSL bağlan hatası

programı bir süre (şimdiye kadar, hiçbir zaman daha uzun bir saat) için çalışıyor ancak SSL ilk defa bağlantı hatası alır sonra, aynı hatayı her zaman vermeye devam edecektir. Başarısız olmaya başlamadan önce, her zaman farklı bir zaman miktarı ve başarılı bir şekilde başarılı istekler gelir.

hata tampon her zaman aşağıdakileri içerir: schannel: next InitializeSecurityContext failed: SEC_E_ILLEGAL_MESSAGE (0x80090326) - This error usually occurs when a fatal SSL/TLS alert is received (e.g. handshake failed). More detail may be available in the Windows System event log.

eventvwr yararlı bir şey yok. Bu hata kodunda yapılan aramalar, Windows Server'ın önceki sürümlerinde kendinden imzalı sertifikalarla ilgili sorunlara yol açar, ancak başka bir şey yoktur. Bağlandığım sunucuyu kontrol etmiyorum, ama sanırım bir Windows kutusu.

Burada fikirlerim tükendi, bu yüzden alakalı olabilecek ayrıntıları vereceğim. Diğerleri bir anlam veremeden ben Demirbaş kodu bir sürü yapıştırmak zorunda kalacak, böylece bütün kıvırmak çeşitli sınıflara uzak çağrıları abstracted ettik çünkü gerçekten herhangi gerçek kaynak kodunu yayınlayamıyor. Visual Studio hata ayıklayıcısını, gerçek çağrıların neye benzediğini doğruladım. herhangi diğerleri oluşturulmadan önce

Öyle gibi, ana iş parçacığı libcurl başlatmak: curl_global_init(CURL_GLOBAL_WIN32 | CURL_GLOBAL_SSL);

Sonra oluşturmak ve ikinci bir iş parçacığı gerçek bukle kolu başlatmak ve sadece bu iş parçacığı, şöyle:

m_handle = curl_easy_init(); 
curl_easy_setopt(m_handle, CURLOPT_WRITEDATA, this); 
curl_easy_setopt(m_handle, CURLOPT_WRITEFUNCTION, write); 
curl_easy_setopt(m_handle, CURLOPT_DEBUGDATA, this); 
curl_easy_setopt(m_handle, CURLOPT_DEBUGFUNCTION, debug); 
curl_easy_setopt(m_handle, CURLOPT_VERBOSE, 1); 
curl_easy_setopt(m_handle, CURLOPT_ERRORBUFFER, &m_errormsg[0]); 
curl_easy_setopt(m_handle, CURLOPT_FOLLOWLOCATION, 1); 
curl_easy_setopt(m_handle, CURLOPT_COOKIEFILE, ""); 

Ben 0'a hem CURLOPT_SSL_VERIFYHOST ve CURLOPT_SSL_VERIFYPEER ayar ile denediği ama yardımcı olmadı.

Ben Visual Studio üzerinde nmake /f Makefile.vc mode=static VC=12 ENABLE_WINSSL=yes ENABLE_SSPI=yes MACHINE=x64 DEBUG=yes ile curl-7.43.0.tar.gz gelen libcurl inşa 2013.

burada oluyor ve bunu nasıl düzeltebilirim ne olacak?

cevap

4

"). Çözelti immedately) o curl_easy_perform() ile yapılır her istek başına bir CURL kolu oluşturmak ve sonra (curl_easy_cleanup büyük olasılıkla.

Ne görüyorsanız muhtemelen SSL bağlantısı kapatılıyor sunucusu neden olmaktadır. Fakat CURL işlemciniz muhtemelen durumunu (yani el sıkışması tamamlandığında) olduğu gibi koruyor ve artık uygun değil.

+0

soruyorum bu değil ama doğru test etmek için zaman yok şimdi. – Jehjoa

2
CURL *handle = curl_easy_init(); 
char url[] = "https://google.com"; 
curl_easy_setopt(handle, CURLOPT_URL, url); 
curl_easy_perform(handle); 

çalışması gerekir ... Sana oluşturmak" demek ve fiili bukle kolu başlatmak beri (tüm istekleri için tek CURL kolunu kullanmakta olduğunuzu tahmin etmeye gidiyorum

+0

Ben öyle eminim ama bu ödül birkaç saat içinde biter beri, ... şimdilik cevap olarak bu işaretleme ediyorum – Jehjoa