libcurl,如何使用字符串作为密码?

libcurl, how to use string as a password?

下面这个例子:

https://github.com/curl/curl/blob/master/docs/examples/smtp-tls.c

我设法通过设置密码让它工作:

curl_easy_setopt(curl, CURLOPT_PASSWORD, "password");

但是,我想将密码设置为字符串,即:

string myPassword = "password";
curl_easy_setopt(curl, CURLOPT_PASSWORD, myPassword);

但是,当我这样做时,出现错误

curl_easy_perform() failed: Login denied

我仔细检查并让程序在发送前打印原始密码和字符串的值。它们完全一样。我有两个功能可以对此进行测试。它们几乎完全相同,只是一个使用硬编码密码而另一个使用字符串。硬编码的工作正常,但使用字符串的却有登录问题。我该如何解决这个问题?

它失败了,因为 curl_easy_setopt() 需要一个 C 风格的字符串,(即 char *)。

在这种情况下,您应该做的是使用 .c_str()std::string 转换为 C 风格的字符串。

所以你应该通过以下方式传递密码:

std::string myPassword = "password";
curl_easy_setopt(curl, CURLOPT_PASSWORD, myPassword.c_str());

CURLOPT_PASSWORD 选项需要 char*,而不是 std::string。您传递的类型错误。图书馆正在以 "wrong" 的方式解释您的数据并变得胡说八道。

这未被诊断,因为 curl_easy_setopt 使用 varargs 来获取不同类型的任意参数,具体取决于设置的选项。 (理想情况下,您的编译器会拒绝或至少警告该程序,但这是使用类型不安全的 C 库的代价!)

您可以使用 std::string::c_str() 传递字符串的 C 字符串版本,如下所示:

curl_easy_setopt(curl, CURLOPT_PASSWORD, myPassword.c_str());

存在一个名为 curlpp 的项目,它声称是 libcurl 的类型安全包装器,这可能值得一看。