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

Reply via email to