Помогите перенести код HTTP API с Win на Linux curllib
Привет всем!
Занимаюсь переносом с Win класса, который занимается посылкой запросов HTTP GET/POST на сервер с помощью WinInet HTTP API, на Linux с помощью curllib. Надеюсь, модераторы пожалеют и не удалят сообщение, хотя оно и не очень связано с Linux - просто я уверена, что здесь есть люди, которые занимались этой библиотекой в Linux. Использую easy interface.
1. В HTTP API можно использовать ::GetLastError() для получения ошибки. Можно ли в curllib просто получить код последней ошибки или там такого нет? Видела, что есть опция для curl_easy_setopt CURLOPT_ERRORBUFFER - можно задать буффер для приема сообщения об ошибке. А можно ли просто получить код?
2. Есть ли аналог InternetOpen? Я так понимаю, что инициализация либы - это просто вызов curl_easy_init - Start a libcurl easy session
он же инициализирует сессию?
Просто в HTTP API делается 2 вызова (взято из MSDN): InternetOpen - Initializes an application's use of the WinINet functions.
InternetConnect - Opens an File Transfer Protocol (FTP), Gopher, or HTTP session for a given site.
Кстати, в последнем вызове задается еще и адрес сервера.
Вообщем, правильно ли я понимаю, что в curllib эти 2 вызова сводятся к curl_easy_init, а, куда коннектиться, указывается потом через опции, скажем, CURLOPT_URL?
3. Правильно ли я понимаю, что CURLOPT_PROXYUSERPWD == INTERNET_OPTION_PROXY_USERNAME + INTERNET_OPTION_PROXY_PASSWORD ? (это опции curl_easy_setopt/InternetSetOption)
INTERNET_OPTION_PROXY_USERNAME - Sets or retrieves a string value that contains the user name used to access the proxy.
INTERNET_OPTION_PROXY_PASSWORD - Sets or retrieves a string value that contains the password used to access the proxy.
4. Нужны аналоги опций HTTP API: INTERNET_OPTION_CONNECT_TIMEOUT - Sets or retrieves an unsigned long integer value that contains the time-out value, in milliseconds, to use for Internet connection requests. If a connection request takes longer than this time-out value, the request is canceled. When attempting to connect to multiple IP addresses for a single host (a multihome host), the timeout limit is cumulative for all of the IP addresses.
INTERNET_OPTION_RECEIVE_TIMEOUT - Sets or retrieves an unsigned long integer value that contains the time-out value, in milliseconds, to receive a response to a request. If the response takes longer than this time-out value, the request is canceled.
INTERNET_OPTION_SEND_TIMEOUT - Sets or retrieves an unsigned long integer value that contains the time-out value to send a request. Units are in milliseconds. If the send takes longer than this time-out value, the send is canceled.
Я нашла только эти: CURLOPT_TIMEOUT (CURLOPT_TIMEOUT_MS)
Pass a long as parameter containing the maximum time in seconds that you allow the libcurl transfer operation to take. Normally, name lookups can take a considerable time and limiting operations to less than a few minutes risk aborting perfectly normal operations. This option will cause curl to use the SIGALRM to enable time-outing system calls.
In unix-like systems, this might cause signals to be used unless CURLOPT_NOSIGNAL is set.
CURLOPT_CONNECTTIMEOUT (CURLOPT_CONNECTTIMEOUT_MS)
Pass a long. It should contain the maximum time in seconds that you allow the connection to the server to take. This only limits the connection phase, once it has connected, this option is of no more use. Set to zero to disable connection timeout (it will then only timeout on the system's internal timeouts). See also the CURLOPT_TIMEOUT option.
In unix-like systems, this might cause signals to be used unless CURLOPT_NOSIGNAL is set.
Не очень понятно, чему соответствует CURLOPT_TIMEOUT? Это все время запроса, т. е. отправка + получение?
Вообщем, непонятно, как задать в curllib INTERNET_OPTION_RECEIVE_TIMEOUT + INTERNET_OPTION_SEND_TIMEOUT.
5. Есть ли аналог HttpOpenRequest + HttpSendRequest? Правильно я понимаю, что нужно просто сделать curl_easy_perform с предварительной установкой нужных опций через curl_easy_setopt?
6. Как в curllib разруливаются ситуации, когда хост, с которого посылаются запросы, будет иметь, скажем, 5 ip адресов, например, но нужно будет отправлять запросы с определенного адреса?