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