Winsock2 登录表单 c++

Winsock2 login Form c++

本文关键字:c++ 表单 登录 Winsock2      更新时间:2023-10-16

所以我已经在这里呆了好几天,我试图使用 C++ 通过 Winsock 连接到我自己的网站。通常我通过谷歌找到我需要的一切,但我似乎无法弄清楚。

char *sendbuf = "POST / HTTP/1.1rn"
    "Host: sn.theskatenetwork.comrn"
    "Accept: text/html, application/xhtml+xmlrn"
    "Content-Type: multipart/form-data; boundary=---------------------------7dd37b37e06e2rn"
    "Content-Length: sizeofbodyrn"
    "Accept-Encoding: gzip, deflatrn"
    "Keep-Alive: 30rn"
    "Connection: Keep-Alivern"
    "rn"
    "---------------------------7dd37b37e06e2rn"
    "Content-Disposition: form-data; name="ID"; text="testing"rn"
    "-----------------------------7dd37b37e06e2rn"
    "---------------------------7dd37b37e06e2rn"
    "Content-Disposition: form-data; name="Password"; text="testing"rn"
    "-----------------------------7dd37b37e06e2rn"
    "rn";

不太确定我是否正确发送输入,因为我所看到的一切都只包括发送文件。我也不知道如何检查cookie以查看我是否已登录。我假设为了做到这一点,我必须再次发送作为获取,但这就是我所知道的。似乎大多数人只使用 vb 来编写 winsock,但现在这不是一个选择。

它不起作用的原因是您的 MIME 正文数据格式不正确:

  1. 您没有正确使用破折号作为每个 MIME 部分之间的边界。 如果你去掉(或至少减少)边界中的破折号,这更容易看到。

  2. 每个 MIME 部分中的文本值格式不正确。 Content-Disposition标头没有text属性。 您需要将文本移动到 MIME 部分的正文,并且需要用空行分隔 MIME 部件的标头和正文,类似于主 HTTP 消息的标头和正文的分离。

试试这个:

char *sendbuf = "POST / HTTP/1.1rn"
    "Host: sn.theskatenetwork.comrn"
    "Accept: text/html, application/xhtml+xmlrn"
    "Content-Type: multipart/form-data; boundary=7dd37b37e06e2rn"
    "Content-Length: 167rn"
    "Accept-Encoding: gzip, deflatern"
    "Keep-Alive: 30rn"
    "Connection: Keep-Alivern"
    "rn"
    "--7dd37b37e06e2rn"
    "Content-Disposition: form-data; name="ID"rn"
    "rn"
    "testingrn"
    "--7dd37b37e06e2rn"
    "Content-Disposition: form-data; name="Password"rn"
    "rn"
    "testingrn"
    "--7dd37b37e06e2--rn";

或者更C++比如:

std::string host = "sn.theskatenetwork.com";
std::string boundary = "7dd37b37e06e2";
std::string id = "testing";
std::string psw = "testing";
std::ostringstream oss;
oss << "--" << boundary << "rn"
       "Content-Disposition: form-data; name="ID"rn"
       "rn"
       << id << "rn"
       "--" << boundary << "rn"
       "Content-Disposition: form-data; name="Password"rn"
       "rn"
       << psw << "rn"
       "--" << boundary << "--rn";
std::string senddata = oss.str();
oss.str("");
oss.clear();
oss << "POST / HTTP/1.1rn"
       "Host: " << host << "rn"
       "Accept: text/html, application/xhtml+xmlrn"
       "Content-Type: multipart/form-data; boundary=" << boundary << "rn"
       "Content-Length: " << senddata.size() << "rn"
       "Accept-Encoding: gzip, deflatern"
       "Keep-Alive: 30rn"
       "Connection: Keep-Alivern"
       "rn"
       << senddata;
std::string sendbuf = oss.str();
// use sendbuf.c_str() and sendbuf.size() as needed...

阅读 RFC 2045、2046、2047、2048 和 2049,了解官方 MIME 规范。

阅读 W3C 的 HTML 规范(HTML4 和 HTML5)以及 RFC 2388,了解如何格式化multipart/form-data数据。

至于 cookie,它们以 HTTP 响应的形式发送给您,您在后续请求中将它们发送回同一服务器/路径。 阅读 RFC 6265 了解官方 cookie 规范。