LINUX.ORG.RU

Curl API. Соединение через SOCKS-прокси


0

0

Здравствуйте!

Пишу сетевое приложение на С, используя CURL. Через прокси-сервер соединяюсь с целевым хостом(сайтом). Если сайт недоступен, начинаем конектиться на его зеркало.
Опции соединения стандартные:

curl_easy_setopt(http_handle, CURLOPT_URL, «example.com»);
curl_easy_setopt(http_handle,CURLOPT_PROXY,«proxy_ip:proxy_port);
curl_easy_setopt(http_handle ,CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
curl_easy_setopt( http_handle , CURLOPT_VERBOSE, 1);
curl_easy_setopt( http_handle , CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt( http_handle , CURLOPT_FRESH_CONNECT, 1);
curl_easy_setopt( http_handle, CURLOPT_TIMEOUT, 5);

Проблема в следующем: после неудачной попытки соединения получаю код ошибки 7 (CURLE_COULDNT_CONNECT) в независимости от причины ошибки:
1)Прокси доступен, но не доступен целевой хост
2)Прокси не доступен

Хотелось бы уметь определить кто именно не доступен: прокси или хост?
Спасибо!

Ответ на: комментарий от anonymous

Попробовал CURLINFO_HTTP_CONNECTCOD. Почему-то не работает

Попробовал элементарный пример с CURLINFO_HTTP_CONNECTCOD. Почему-то не работает. Код ошибки прокси всегда возвращает 0. Для эксперимента запусил на localhost прокси dante. Указываю неверный порт прокси, все равно возвращает 0. Может что-то не так написал?

CURL *http_handle;
// CURL *http_handle2;
CURLM *multi_handle;
CURLMsg *msg;
CURLcode res;
long response=-1;

int still_running;

http_handle = curl_easy_init();

curl_easy_setopt(http_handle, CURLOPT_URL, «localhost:80»);
curl_easy_setopt(http_handle,CURLOPT_PROXY,«127.0.0.1:5555»);
curl_easy_setopt(http_handle ,CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_easy_setopt( http_handle , CURLOPT_VERBOSE, 1);
curl_easy_setopt( http_handle , CURLOPT_FRESH_CONNECT, 1);
curl_easy_setopt( http_handle, CURLOPT_TIMEOUT, 5);
curl_easy_setopt( http_handle, CURLOPT_HTTPPROXYTUNNEL, 1);

multi_handle = curl_multi_init();
curl_multi_add_handle(multi_handle, http_handle);

while(still_running) {

    while(CURLM_CALL_MULTI_PERFORM ==
    curl_multi_perform(multi_handle, &still_running));

    struct timeval timeout;
int rc;

fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd = -1;

FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);

timeout.tv_sec = 1;
timeout.tv_usec = 0;

curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);

int msgs_left;

   while ((msg = curl_multi_info_read(multi_handle, &msgs_left)))
    {


      if (msg->msg == CURLMSG_DONE)
         {
            fprintf(stderr,«\nDone»);
            fprintf(stderr,«Transfer status_end = %d », msg->data.result);


            res = curl_easy_getinfo(http_handle, CURLINFO_HTTP_CONNECTCODE , &response);
            if((CURLE_OK == res) && response)
            {
               fprintf(stderr,«response code: %lul code\n», response);
               return 1;
            }

         }
    }
}

nitroxolyne
() автор топика
Ответ на: комментарий от anonymous

Ерунда это все. Мьсе автор не потрудился выделить код ошибки для причины дисконнекта, а просто присвоил ошибке код 7 (CURLE_COULDNT_CONNECT (7) Failed to connect() to host or proxy.). Хотя, если включиьть VERBOSE, то можно увидеть различные сообщения о процессе подключения к прокси, типа:
1)Failed to receive SOCKS5 connect request ack
2)Connection refused
...
В этом мэйл-листе в красках описана ситуация c CURLINFO_HTTP_CONNECTCODE: http://curl.haxx.se/mail/lib-2007-05/0023.html. В конечном счете автор не помог челову с конкретным вопром: кто виноватв дисконнекте: прокси или сервер и отослал к RFC, описывающему HHTP_1.1. После долгих ковыряний нашел опцию CURLINFO_OS_ERRNO, которая не решила моей проблемы. Но унывать не стоит, есть еще и CURLINFO_PRIVATE)))

nitroxolyne
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.