使用C语言中的libcurl通过HTTPS上传文件

时间:2017-07-24 17:36:28

标签: c curl file-upload

我正在使用C中的curl库通过HTTPS编写文件上传。 服务器端使用ulfius框架运行一个小型Web应用程序。

我的代码看起来像这样(简短):

CURL *curl;
CURLcode res;
void * buffer = NULL;
long length;
FILE *fd;

fd = fopen(filePath, "rb");
if (fd) {
  fseek(fd, 0, SEEK_END);
  length = ftell(fd);
  fseek(fd, 0, SEEK_SET);
  buffer = malloc(length * sizeof (void));
  if (buffer) {
      fread(buffer, 1, length, fd);
  }
  fclose(fd);
}

curl = curl_easy_init();
if (curl) {
  struct curl_slist *chunk = NULL;
  chunk = curl_slist_append(chunk, "Accept: */*");
  chunk = curl_slist_append(chunk, "X-IsReplication: 1");

  curl_easy_setopt(curl, CURLOPT_URL, "https://192.168.1.6:8080/upload/test.txt/");
  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
  curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
  curl_easy_setopt(curl, CURLOPT_HTTPHEADER, chunk);
  curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, length);
  curl_easy_setopt(curl, CURLOPT_POSTFIELDS, buffer);

  res = curl_easy_perform(curl);
  if (res != CURLE_OK) {
    fprintf(stderr, "Error: %s\n", curl_easy_strerror(res));
  } else {
    printf("Success!\n");
  }

  curl_easy_cleanup(curl);
}

来自curl_easy_strerror()的错误消息是:"从对等方接收数据时失败"。 如果我使用Wireshark进行捕获,我会看到一些加密的TCP数据包,但没有TLS数据包。 "客户端Hello"和"服务器Hello"消息也丢失了。

让我们假装服务器端正常工作,因为如果我切换到HTTP(服务器+客户端),一切正常。 我的代码的卷曲部分是否缺少某些东西? 似乎没有SSL / TLS握手。

1 个答案:

答案 0 :(得分:0)

我尝试了您的代码,TLS / SSL连接正常。请尝试以下方法:

  • 使用online tool检查服务器TLS / SSL配置。
  • 如果您的服务器正确实现了它,请尝试使用以下代码行强制使用首选TLS / SSL:curl_easy_setopt(CURL *handle, CURLOPT_SSLVERSION, long version);

有关此命令的更多文档here