Libcurl - многопротокольная библиотека

Предыдущая тема Следующая тема Перейти вниз

Libcurl - многопротокольная библиотека

Сообщение  electrik в Вт Ноя 20, 2012 12:02 am

Libcurl

libcurl это свободная и простая в использовании клиентская библиотека по передачи данных по URL, она поддерживает DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET и TFTP. Также libcurl имеет поддержку SSL сертификатов, HTTP POST, HTTP PUT, FTP загрузку, HTTP form загрузку, proxy, cookies, user+password авторизацию (Basic, Digest, NTLM, Negotiate, Kerberos), докачивания файлов, http прокси туннелирования и многого другого!

libcurl легко переносима, она собирается и работает на многих платформах, включая Solaris, NetBSD, FreeBSD, OpenBSD, Darwin, HPUX, IRIX, AIX, Tru64, Linux, UnixWare, HURD, Windows, Amiga, OS/2, BeOs, Mac OS X, Ultrix, QNX, OpenVMS, RISC OS, Novell NetWare, DOS и остальные...

libcurl свободна, потокобезопасна, совместима с IPv6, функциональна, имеет хорошую поддержку, быстрая, тщательно задокументирована и уже используется во многих известных, крупных и успешных компаний и в многочисленных приложениях.

Русская документация - от туда и будет пример ниже.
Оф сайт
Пример программы + подправленный curl.bi + dll библиотеки

на момент написания этой темы, уже существует версия curl-7.28.0. мы же будем использовать заголовочные файлы, поставляемые с FreeBasic - curl-7.24.0. версия не такая уж старая- январь 2012.

перед тем как использовать curl, нужно открыть файл "/inc/curl.bi" и найти там строку:

CINIT(STDERR, OBJECTPOINT, 37)
и переписать ее вот так:

CINIT(STDERR_, OBJECTPOINT, 37)

по традиции FreeBasic, после названия я поставил знак подчёркивания _.
дело в том, что макрос STDERR, пересекается с стандартным си макросом:
Код:

#define STDERR_FILENO 2
extern import _iob(0 to 2) alias "_iob" as FILE
#define stderr (@_iob(STDERR_FILENO))

макросы это польза и зло. я два дня не мог врубится, в чем дело. возможно правильно, что в других языках от них избавляются.

пример программы, демонстрирует получение HTTP заголовка и HTML страницы. все это записывается в два файла, head.out и body.out.
для открытия файлов, я оставил оригинальные функции си, так как fb'шные тут не годятся.
Код:

/'**************************************************************************
 *                                  _  _ ____  _
 *  Project                    ___| | | |  _ \| |
 *                            / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                            \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at http://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 **************************************************************************'/
#include "crt/stdio.bi"
#include "curl.bi"
 
function write_data(byval ptr_ as any ptr, byval size as size_t, byval nmemb as size_t, byval stream as any ptr) as size_t
  dim as integer written = fwrite(ptr_, size, nmemb, stream)
  return written
end function

 function main() as integer
  dim as  CURL ptr curl_handle
  static as zstring ptr headerfilename = @"head.out"
  dim as FILE ptr headerfile
  static as zstring ptr bodyfilename = @"body.out"
  dim as FILE ptr bodyfile
 
  curl_global_init(CURL_GLOBAL_ALL)
 
  /' инициализация сессии curl '/
  curl_handle = curl_easy_init()
 
  /' установка URL '/
  curl_easy_setopt(curl_handle, CURLOPT_URL, "http://freebasic.justforum.net")
 
  /' нам не нужно уведомление о прогрессе '/
  curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L)
 
  /' посылать все данные в эту функцию  '/
  curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, @write_data)
 
  /' открытие файлов '/
  headerfile = fopen(headerfilename,"w")
  if (headerfile = NULL) then
    curl_easy_cleanup(curl_handle)
    return -1
  end if
  bodyfile = fopen(bodyfilename,"w")
  if (bodyfile = NULL) then
    curl_easy_cleanup(curl_handle)
    return -1
  end if
 
  /' помещать заголовки в этот файловый дескриптор '/
  curl_easy_setopt(curl_handle,  CURLOPT_WRITEHEADER, headerfile)
 
  /'
  * Обратите внимание, если вы хотите выводить не в stdout,
  * вам необходимо использовать опцию CURLOPT_WRITEDATA.  '/
  curl_easy_setopt(curl_handle,  CURLOPT_WRITEDATA, bodyfile) ' если убрать эту строчку, то html'ка выведется на экран

  /' получить! '/
  curl_easy_perform(curl_handle)

/' закрытие файлового дескриптора '/
  fclose(bodyfile)
  fclose(headerfile)
 
  /' очистка '/
  curl_easy_cleanup(curl_handle)
 
  return 0
end function

end(main())


Последний раз редактировалось: electrik (Чт Ноя 22, 2012 1:36 pm), всего редактировалось 1 раз(а)

electrik

Сообщения : 394
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Libcurl - многопротокольная библиотека

Сообщение  trew в Вт Ноя 20, 2012 10:11 am

Спасибо.

P.S. Ссылочка на пример не совсем корректная (лишняя кавычка)

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Libcurl - многопротокольная библиотека

Сообщение  electrik в Чт Ноя 22, 2012 1:39 pm

Спасибо. ссылку подправил.

electrik

Сообщения : 394
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Непонятки с Libcurl

Сообщение  justar в Ср Авг 14, 2013 9:22 am

Пишу XML-RPC server, получающий от клиентов команды в виде XML-документов через HTTP POST. Возникла проблема:

Как только включаю в проект #Include "curl.bi", компилятор версии 0.90 начинает ругаться:
OrionAccess.bas(5) warning 12(0): Missing closing quote in literal string
C:\FreeBasic\Compilier\inc\curl.bi(1049) error 3: Expected End-of-Line, found 'HTTP/1.0' in 'CINIT(HTTP_VERSION, LONG, 84)'
на следующий фрагмент curl.bi:
Код:
 /' These enums are for use with the CURLOPT_HTTP_VERSION option. '/
enum
  CURL_HTTP_VERSION_NONE  
  CURL_HTTP_VERSION_1_0  
 CURL_HTTP_VERSION_1_1  
 CURL_HTTP_VERSION_LAST  
end enum


/'
 * This macro-mania below setups the CURLOPT_[what] enum, to be used with
 * curl_easy_setopt(). The first argument in the CINIT() macro is the [what]
 * word.
 '/

enum CURLoption
...
 /' Specify which HTTP version to use! This must be set to one of the
     CURL_HTTP_VERSION* enums set below. '/
  CINIT(HTTP_VERSION, LONG, 84)
...
end enum
Из-за чего ошибки и как их лечить?

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 42
Откуда : Кишинёв, Республика Молдоа

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Libcurl - многопротокольная библиотека

Сообщение  electrik в Сб Авг 17, 2013 9:15 pm

ошибка missing close literal string - это где-то ты забыл закрыть кавычку. может при объявлении заголовка, или в какой-нибудь строковой переменной.
во FreeBasic, есть манера выкладывать битые заголовки. и тянется это еще со старых версий.
попробуй скачать мой подправленный curl
ftp://el-zone.spb.ru/freebasic/libs/curl.rar
как они их делают, фиг знает. я когда переделываю заголовочные файлы, сразу на каком-нибудь примере тестирую. даже не на одном.
ладно бы у них была ошибка на какую-нибудь функцию которая редко используется и пример не всегда придумаешь, а вот на макросе CINIT...
скажу что там за ошибки.
используется два ключевых слова name и type.
я подправил на name_ и type_. думаю догадались в чем дело.
скорее всего, делалось это каким-нибудь wrapper'ом, которому пофиг на ключевые слова FreeBasic.

electrik

Сообщения : 394
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Непонятки с Libcurl

Сообщение  justar в Вс Авг 18, 2013 9:55 am

electrik пишет:ошибка missing close literal string - это где-то ты забыл закрыть кавычку.
Методом проб и ошибок выяснил, что ошибка появляется из-за подключаемого до curl.bi window9.bi. Если порядок подключения этих заголовков поменять, то ошибка вылетает уже в вызываемом из window9.bi zlib.bi Я пока решил проблему закомментировав в window9.bi подключение zlib.bi

justar

Сообщения : 135
Дата регистрации : 2008-05-12
Возраст : 42
Откуда : Кишинёв, Республика Молдоа

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Libcurl - многопротокольная библиотека

Сообщение  electrik в Вт Авг 20, 2013 12:19 am

ну думаю, что ты обновляешь window9? там и zlib, вродь тоже исправленный. поставляемый с FreeBasic, по крайней мере с 0.24 был глючный. 0.90 не проверял.

electrik

Сообщения : 394
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Libcurl - многопротокольная библиотека

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения