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

时间:2019-02-24 22:20:29

标签: c++ libcurl

下面的示例:

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

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

2 个答案:

答案 0 :(得分:5)

CURLOPT_PASSWORD选项需要char*,而不是std::string。您传递的类型错误。该库正在以“错误”的方式解释您的数据并变得毫无意义。

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

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

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

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

答案 1 :(得分:2)

失败的原因是curl_easy_setopt()需要一个C样式的字符串(即char *)。

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

因此,您应该通过以下方式传递密码:

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