вторник, 5 октября 2010 г.

Работа с протоколами FTP, HTTP, HTTPS, SCP, TELNET, SMTP, POP3 и т.п. - с помощью библиотеки cURL

Бывает задача, что надо скачать "что-то" из сети программным способом,  по протоколу FTP или HTTP, или получить почту, или сделать "что-то" через telnet...
Можно конечно попытать "счастья" в программировании сокетов, однако это прямой путь к изобретению велосипеда. Если же еще и делать такую программу кроссплатформенной, то времени на разработку основной задачи может и не остаться...

Чтобы не изобретать велосипедов, можно использовать библиотеку cURL . Эта библиотека умеет работать на платформах Win и Linux. Умеет работать с протоколами: DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET и TFTP. В последней версии (7.21.1) есть возможность работы с почтовыми протоколами SMTP и POP. Кроме того, умеет работать через прокси сервер.

Далее я расскажу как установить эту библиотеку:

В  Linux:
Качаем с официального сайта http://curl.haxx.se/ необходимый архив с исходниками.
Распаковываем и далее, стандартыми командами, (./configure make install) устанавливаем.
На этом установка завершена.


Для  Win:
Все просто, скачиваем libcurl, распаковываем в какую-нибудь директорию.

У меня например все сторонние библиотеки располагаются в одной директории, вот так:
C:\C++ Libs\
    \curl-7.21.1
    \zlib_1_2_5
    ...
Что считаю удобным т.к.все собрано в одном месте да и потом прописывать пути в разных прогах проще.

После всех манипуляций запускаем IDE, я например использую CodeBlock, поэтому далее рассказываю на основе этой IDE.
Создаем проект. (например - консоле апликацию)
Далее, подключаем библиотеку cURL к нашему проекту.
Идем в Menu->Project-Build Options и прописываем пути к библиотекам.

Очень Важно! Соблюдаем именно такой порядок следования:
libcurl.a
libwsock32.a (из пакета minGW)
libwldap32.a (из пакета minGW)

libz.a - библиотеку zlib я добавляю отдельно, хотя она есть и в варианте поставки curl. Можно использовать и так, и так.

Приведенный выше список библиотек является минимальным для работы cURL.

В свой проект я добавил дополнительные библиотеки из поставки cURL:

В разделе #define нужно задать: CURL_STATICLIB
Например так: 


Небольшой пример скачивания веб страницы:

#include <string>
#include <iostream>
#include "curl/curl.h"
using namespace std;

//буфер, для хранения  ошибки
static char errorBuffer[CURL_ERROR_SIZE]; 
//Скаченные данные
static string buffer; 

//Эта ф-ия вызывется при получении данных
static int writer(char *data, size_t size, size_t nmemb, string *buffer)
{
  int res = 0;
  if (buffer != NULL)
  {
    buffer->append(data, size * nmemb);    
    res = size * nmemb;
  }  
  return res;
}

int main(void)
{    
    CURL *curl;
    CURLcode result;    
    curl = curl_easy_init();    
    if (curl)
    {
      //Установка опций    
      curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer);
      curl_easy_setopt(curl, CURLOPT_URL, "www.ya.ru");
      curl_easy_setopt(curl, CURLOPT_HEADER, 1);      
      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);      
      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
      //Запуск на выполнение
      result = curl_easy_perform(curl);      
      if (result == CURLE_OK)      
        cout << buffer << "\n";
      else        
        cout << "Error :" << errorBuffer << endl;
  }  
  curl_easy_cleanup(curl);
  return 0;
}

На этом пока все, в следующей статье напишу как работать с почтой через cURL.



Полезные ссылки: 
http://ru.wikipedia.org/wiki/CURL 
http://www.xakep.ru/magazine/xa/121/092/1.asp 
http://pblog.ru/?p=607#more-607

Комментариев нет:

Отправить комментарий