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 的类型安全包装器,这可能值得一看。
下面这个例子:
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 的类型安全包装器,这可能值得一看。