Skip Navigation

Why isn't libcurl doing anything?

I have tried googling, and found no solution to my problem. I'm trying to learn how to use libcurl, a c networking library. I tried compiling a program that was automatically generated from curl, and a few examples i found online but nothing happened. I got no errors or logs, the program stopped "sucessfully" but i get no output. I also cant write to the console either while the library is included.

Any help is appreciated.

17
17 comments
  • There's no way to even attempt to answer your question without the actual code

    • You're right, but it doesn't do anything, no matter what the code is, so I assumed that I needn't include it. Kinda stupid of me. In any case, here it is:

      /********* Sample code generated by the curl command line tool **********
       * All curl_easy_setopt() options are documented at:
       * https://curl.se/libcurl/c/curl_easy_setopt.html
       ************************************************************************/
      #include <curl/curl.h>
      
      int main(int argc, char *argv[])
      {
        CURLcode ret;
        CURL *hnd;
      
        hnd = curl_easy_init();
        curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
        curl_easy_setopt(hnd, CURLOPT_URL, "https://pastebin.com/api/api_post.php");
        curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, "api_dev_key=MY_API_KEY&api_paste_code=test&api_option=paste");
        curl_easy_setopt(hnd, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)81);
        curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/8.9.1");
        curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
        curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 1L);
        curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
      
        /* Here is a list of options the curl code used that cannot get generated
           as source easily. You may choose to either not use them or implement
           them yourself.
      
        CURLOPT_WRITEDATA was set to an object pointer
        CURLOPT_WRITEFUNCTION was set to a function pointer
        CURLOPT_READDATA was set to an object pointer
        CURLOPT_READFUNCTION was set to a function pointer
        CURLOPT_SEEKDATA was set to an object pointer
        CURLOPT_SEEKFUNCTION was set to a function pointer
        CURLOPT_ERRORBUFFER was set to an object pointer
        CURLOPT_STDERR was set to an object pointer
        CURLOPT_HEADERFUNCTION was set to a function pointer
        CURLOPT_HEADERDATA was set to an object pointer
      
        */
      
        ret = curl_easy_perform(hnd);
      
        curl_easy_cleanup(hnd);
        hnd = NULL;
      
        return (int)ret;
      }
      /**** End of sample code ****/
      

      Another piece of code i tried was:

      #include <stdio.h>
      #include <curl/curl.h>
      
      int main(void) {
          CURL *curl;
          CURLcode res;
      
      
          curl_global_init(CURL_GLOBAL_DEFAULT);
          curl = curl_easy_init();
      
          if(curl) {
             
              curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:5000/a");
      
           
              const char *data = "hello!";
              curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
      
      
              res = curl_easy_perform(curl);
      
           
              if(res != CURLE_OK) {
                  fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
              }
      
        
              curl_easy_cleanup(curl);
          }
      
        
          curl_global_cleanup();
      
          return 0;
      }
      

      compiled it with gcc test.c -o test.exe -IC:\Users\MY_USERNAME\scoop\apps\curl\current\include -LC:\Users\MY_USERNAME\scoop\apps\curl\current\lib -lcurl but you can replace the paths with wherever the libcurl include directory is (i hope).

  • I got no errors or logs, the program stopped “sucessfully” but i get no output.

    This makes it sound like your code is doing what you're telling it to do with no errors. Show us your code and we can help figure out the delta between expectation and reality.

    • You're right, but it doesn't do anything, no matter what the code is, so I assumed that I needn't include it. Kinda stupid of me. In any case, here it is:

      /********* Sample code generated by the curl command line tool **********
       * All curl_easy_setopt() options are documented at:
       * https://curl.se/libcurl/c/curl_easy_setopt.html
       ************************************************************************/
      #include <curl/curl.h>
      
      int main(int argc, char *argv[])
      {
        CURLcode ret;
        CURL *hnd;
      
        hnd = curl_easy_init();
        curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
        curl_easy_setopt(hnd, CURLOPT_URL, "https://pastebin.com/api/api_post.php");
        curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, "api_dev_key=MY_API_KEY&api_paste_code=test&api_option=paste");
        curl_easy_setopt(hnd, CURLOPT_POSTFIELDSIZE_LARGE, (curl_off_t)81);
        curl_easy_setopt(hnd, CURLOPT_USERAGENT, "curl/8.9.1");
        curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
        curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
        curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 1L);
        curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);
      
        /* Here is a list of options the curl code used that cannot get generated
           as source easily. You may choose to either not use them or implement
           them yourself.
      
        CURLOPT_WRITEDATA was set to an object pointer
        CURLOPT_WRITEFUNCTION was set to a function pointer
        CURLOPT_READDATA was set to an object pointer
        CURLOPT_READFUNCTION was set to a function pointer
        CURLOPT_SEEKDATA was set to an object pointer
        CURLOPT_SEEKFUNCTION was set to a function pointer
        CURLOPT_ERRORBUFFER was set to an object pointer
        CURLOPT_STDERR was set to an object pointer
        CURLOPT_HEADERFUNCTION was set to a function pointer
        CURLOPT_HEADERDATA was set to an object pointer
      
        */
      
        ret = curl_easy_perform(hnd);
      
        curl_easy_cleanup(hnd);
        hnd = NULL;
      
        return (int)ret;
      }
      /**** End of sample code ****/
      

      Another piece of code i tried was:

      #include <stdio.h>
      #include <curl/curl.h>
      
      int main(void) {
          CURL *curl;
          CURLcode res;
      
      
          curl_global_init(CURL_GLOBAL_DEFAULT);
          curl = curl_easy_init();
      
          if(curl) {
             
              curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:5000/a");
      
           
              const char *data = "hello!";
              curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
      
      
              res = curl_easy_perform(curl);
      
           
              if(res != CURLE_OK) {
                  fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
              }
      
        
              curl_easy_cleanup(curl);
          }
      
        
          curl_global_cleanup();
      
          return 0;
      }
      

      compiled it with gcc test.c -o test.exe -IC:\Users\MY_USERNAME\scoop\apps\curl\current\include -LC:\Users\MY_USERNAME\scoop\apps\curl\current\lib -lcurl but you can replace the paths with wherever the libcurl include directory is (i hope).

  • As a sanity check, does this work?

    #include <curl/curl.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    size_t save_to_disk(char* ptr, size_t size, size_t nmemb, void* user_data)
    {
        /* according to curl's docs size is always 1 */
        
        FILE* fp = (FILE*)user_data;
        fprintf(stderr, "got %lu bytes\n", nmemb);
        return fwrite(ptr, size, nmemb, fp);
    }
    
    int main(int argc, char* argv[])
    {
        char errbuf[CURL_ERROR_SIZE];
        FILE* fp = NULL;
        CURLcode res;
        
        CURL* curl = curl_easy_init();
        
        if(!curl)
        {
            fprintf(stderr, "Failed to initialize curl\n");
            return EXIT_FAILURE;
        }
        
        fp = fopen("output.data", "wb");
        if(!fp)
        {
            fprintf(stderr, "Failed to open file for writing!");
            return EXIT_FAILURE;
        }
        
        curl_easy_setopt(curl, CURLOPT_URL, "https://www.wikipedia.org");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, save_to_disk);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
        curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errbuf);
        
        errbuf[0] = 0;  /* set error buffer to empty string */
        res = curl_easy_perform(curl);
        
        if(fp)
        {
            fclose(fp);
            fp = NULL;
        }
        
        if(res != CURLE_OK)
        {
            fprintf(stderr, "error code   : %d\n", res);
            fprintf(stderr, "error buffer : %s\n", errbuf);
            fprintf(stderr, "easy_strerror: %s\n", curl_easy_strerror(res));
            
            return EXIT_FAILURE;
        }
        else
        {
            fprintf(stderr, "\nDone\n");
            return EXIT_SUCCESS;
        }
    }
    

    That should write a file called output.data with the HTML from https://www.wikipedia.org and print out the number of bytes each time the write callback receives data for processing.

    On my machine, it prints the following when it works successfully (byte counts may vary for you):

    got 13716 bytes
    got 16320 bytes
    got 2732 bytes
    got 16320 bytes
    got 16320 bytes
    got 128 bytes
    got 16320 bytes
    got 16320 bytes
    got 1822 bytes
    
    Done
    

    If I change the URL to nonsense instead to make it fail, it prints text like this on my system:

    error code   : 6
    error buffer : Could not resolve host: nonsense
    easy_strerror: Couldn't resolve host name
    

    Edit: corrected missing line in source (i.e. added line with CURLOPT_ERRORBUFFER which is needed to get extra info in the error buffer on failure, of course)

    Edit 2: tweaks to wording to try to be more clear

    • PS C:\Users\USERNAME\3ds> gcc test.c -o test.exe -IC:\Users\22.tom.carroll\scoop\apps\curl\current\include -LC:\Users\22.tom.carroll\scoop\apps\curl\current\lib -lcurl
      PS C:\Users\USERNAMEl\3ds> ./test.exe
      PS C:\Users\USERNAME3ds> ls
      
      
          Directory: C:\Users\USERNAME\3ds
      
      
      Mode                 LastWriteTime         Length Name
      ----                 -------------         ------ ----
      d-----        19/11/2024     20:48                c
      -a----        29/11/2024     21:35           1880 file.c
      -a----        29/11/2024     22:52           1409 test.c
      -a----        29/11/2024     22:52         236221 test.exe
      
      
      PS C:\Users\USERNAME\3ds>
      

      Its not working unfortunatly.

      • Does hello world work? You should've gotten at least some console output.

        #include <stdio.h>
        
        int main()
        {
            fprintf(stderr, "Hello world\n");
            return 0;
        }
        
  • Does your Antivirus or Firewall prevents it from accessing the internet maybe?

You've viewed 17 comments.