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 < [email protected]>: > 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
