cURL / Mailing Lists / curl-library / Single Mail

curl-library

Re: Using CURLOPT_UNIX_SOCKET_PATH

From: Boutin Maël <mael.boutin_at_gmail.com>
Date: Tue, 1 Mar 2016 09:22:57 +0100

Hi, thanks for your help.

Finally i got it, i had two versions of libcurl installed on my machine.
One in 7.19 and the latest which i compiled and installed yesterday to test
unix domain socket.

In fact i was pointing to the good headers so i had the UNIX_SOCKET_PATH
option, BUT i was not linking with the good library ! i Found that by
checking the return code when setting the UNIX_SOCKET_PATH option

Ray you were on the right track and thanks Dan for the tip i did not know
about it !

Regards,

2016-02-29 21:12 GMT+01:00 Ray Satiro via curl-library <
curl-library_at_cool.haxx.se>:

> On 2/29/2016 11:31 AM, Boutin Maël wrote:
>
>> Dear all,
>>
>> I'm trying to use libcurl using unix domain sockets but i'm facing an
>> issue. When i call curl_easy_perform i get this output:
>>
>> * About to connect() to localhost port 80 (#0)
>> * Trying 127.0.0.1... * Connection refused
>> * couldn't connect to host
>> * Closing connection #0
>> * Couldn't connect to server
>> Duration: 0, Nb Bytes sent: 0
>>
>> So i tested it using the curl binary :
>>
>> curl -vS --unix-socket "/home/boutinm/test" http://localhost
>> * Rebuilt URL to: http://localhost/
>> * Trying /home/boutinm/test...
>> * Connected to localhost (/home/boutinm/test) port 80 (#0)
>> > GET / HTTP/1.1
>> > Host: localhost
>> > User-Agent: curl/7.47.1
>> > Accept: */*
>> >
>>
>> It works this way (my server receives the request). The verbose output is
>> clearly not the same as the one i obtained with libcurl. It seems like the
>> CURLOPT_UNIX_SOCKET_PATH option is not taken into account.
>>
>> Here is how i initialize my curl handle:
>>
>> //Initialize curl handle
>> m_pCurlHandle = curl_easy_init();
>> curl_easy_setopt(m_pCurlHandle, CURLOPT_POST, 1L);
>> curl_easy_setopt(m_pCurlHandle, CURLOPT_READFUNCTION, pushBuffer);
>> curl_easy_setopt(m_pCurlHandle, CURLOPT_VERBOSE, 1L);
>> curl_easy_setopt(m_pCurlHandle, CURLOPT_UNIX_SOCKET_PATH,
>> "/home/boutinm/test");
>> //Curl headers
>> m_pstCurlHeaders = curl_slist_append(m_pstCurlHeaders,
>> "Transfer-Encoding: chunked");
>> m_pstCurlHeaders = curl_slist_append(m_pstCurlHeaders, "Expect:");
>> curl_easy_setopt(m_pCurlHandle, CURLOPT_HTTPHEADER, m_pstCurlHeaders);
>> curl_easy_setopt(m_pCurlHandle, CURLOPT_URL, "http://localhost/");
>> curl_easy_setopt(m_pCurlHandle, CURLOPT_READDATA, m_pstDataBuffer);
>> res = curl_easy_perform(m_pCurlHandle);
>>
>> Am i missing something ?
>>
>> FYI the code works when i use network sockets, but i'd like to use unix
>> domain sockets for performance (i believe it'll be better than using ip
>> stack)
>>
>
> I don't see anything wrong with your code as long as you're setting
> m_pstCurlHeaders to NULL beforehand. You aren't checking the setopt return
> codes and while that is not strictly required it can help to do that to
> identify options like this that may not be available. My guess is unix
> sockets is either not supported or disabled in the libcurl that is being
> used. In other words I think the libcurl used by your curl tool is
> different from the libcurl used by your program. To use
> CURLOPT_UNIX_SOCKET_PATH [1] you need 7.40+ and that it wasn't disabled by
> passing --disable-unix-sockets to configure.
>
> curl_version_info_data *ver;
> ver = curl_version_info(CURLVERSION_NOW);
> printf("\nYou are using libcurl/%s\nUnix Socket Support: %s\n\n",
> ver->version,
> (ver->features & CURL_VERSION_UNIX_SOCKETS) ? "Yes" : "No");
>
> also
>
> CURLcode ec;
> ec = curl_easy_setopt(hnd, CURLOPT_UNIX_SOCKET_PATH,
> "/home/boutinm/test");
> if(ec != CURLE_OK) {
> fprintf(stderr, "problem!\n");
> exit(EXIT_FAILURE);
> }
>
> If that is the problem and your libcurl is static check if there is more
> than one libcurl.a. If your libcurl is shared you may be able to fix it by
> using either LD_PRELOAD or rpath to load the libcurl with unix socket
> support. For example in Ubuntu 14 the curl package is curl 7.35 and I have
> that installed but I also build and install the latest curl and install in
> /usr/local.
>
> gcc -o x x.c -I/usr/local/include -L/usr/local/lib -lcurl
> LD_PRELOAD=/usr/local/lib/libcurl.so.4 ./x
> or
> gcc -o x x.c -Wl,-rpath,/usr/local/lib -I/usr/local/include
> -L/usr/local/lib -lcurl
> ./x
>
> And if that's not the problem reply with the libcurl version used by your
> program and a self contained example and maybe someone will try to
> reproduce.
>
>
> [1]: https://curl.haxx.se/libcurl/c/CURLOPT_UNIX_SOCKET_PATH.html
>
>
> -------------------------------------------------------------------
> List admin: https://cool.haxx.se/list/listinfo/curl-library
> Etiquette: https://curl.haxx.se/mail/etiquette.html
>

-- 
Maël BOUTIN

-------------------------------------------------------------------
List admin: https://cool.haxx.se/list/listinfo/curl-library
Etiquette: https://curl.haxx.se/mail/etiquette.html
Received on 2016-03-01