2015-01-15 3 views
0

поэтому я был в этом в течение нескольких дней, я пытаюсь подключиться к своему собственному веб-сайту через winsock, используя C++. обычно я нахожу все, что мне нужно, через Google, но я не могу понять, как это понять.Winsock2 login Form C++

char *sendbuf = "POST/HTTP/1.1\r\n" 
    "Host: sn.theskatenetwork.com\r\n" 
    "Accept: text/html, application/xhtml+xml\r\n" 
    "Content-Type: multipart/form-data; boundary=---------------------------7dd37b37e06e2\r\n" 
    "Content-Length: sizeofbody\r\n" 
    "Accept-Encoding: gzip, deflat\r\n" 
    "Keep-Alive: 30\r\n" 
    "Connection: Keep-Alive\r\n" 
    "\r\n" 
    "---------------------------7dd37b37e06e2\r\n" 
    "Content-Disposition: form-data; name=\"ID\"; text=\"testing\"\r\n" 
    "-----------------------------7dd37b37e06e2\r\n" 
    "---------------------------7dd37b37e06e2\r\n" 
    "Content-Disposition: form-data; name=\"Password\"; text=\"testing\"\r\n" 
    "-----------------------------7dd37b37e06e2\r\n" 
    "\r\n"; 

Я не уверен, правильно ли я отправляю входные права, поскольку все, что я видел, состоит только из отправки файлов. Я также не могу понять, как проверить файлы cookie, чтобы узнать, был ли я зарегистрирован. Я предполагаю, что для этого мне нужно отправить снова, как получить, но это все, что я знаю. Кажется, что большинство людей используют vb только для написания winsock, но сейчас это не вариант.

+0

Есть ли причина, по которой вы делаете это вручную, вместо использования существующего API/библиотеки? Например, у Microsoft есть API WinINET и WinHTTP. Или используйте libcurl или любое количество других библиотек. HTTP - это сложный протокол для реализации вручную. Не заново изобретайте колесо. –

+0

Я скорее изучаю это с трудом. Мне нравятся проблемы. –

ответ

0

Причина это не работает, потому что ваш MIME тело данные имеют неверный формат:

  1. вы не используете тир правильно для границ между каждой MIME частью. Если вы избавитесь от (или, по крайней мере, уменьшите) тире на своей границе, это легче увидеть.

  2. Ваши текстовые значения внутри каждой части MIME не отформатированы правильно. Заголовок Content-Disposition не имеет атрибута text. Вам нужно переместить текст в тело части MIME, и вам нужно разделить заголовки и тело части MIME пустой строкой, аналогичной разделению заголовков и тела основного HTTP-сообщения.

Попробуйте вместо этого:

char *sendbuf = "POST/HTTP/1.1\r\n" 
    "Host: sn.theskatenetwork.com\r\n" 
    "Accept: text/html, application/xhtml+xml\r\n" 
    "Content-Type: multipart/form-data; boundary=7dd37b37e06e2\r\n" 
    "Content-Length: 167\r\n" 
    "Accept-Encoding: gzip, deflate\r\n" 
    "Keep-Alive: 30\r\n" 
    "Connection: Keep-Alive\r\n" 
    "\r\n" 
    "--7dd37b37e06e2\r\n" 
    "Content-Disposition: form-data; name=\"ID\"\r\n" 
    "\r\n" 
    "testing\r\n" 
    "--7dd37b37e06e2\r\n" 
    "Content-Disposition: form-data; name=\"Password\"\r\n" 
    "\r\n" 
    "testing\r\n" 
    "--7dd37b37e06e2--\r\n"; 

Или больше C++ как:

std::string host = "sn.theskatenetwork.com"; 
std::string boundary = "7dd37b37e06e2"; 
std::string id = "testing"; 
std::string psw = "testing"; 

std::ostringstream oss; 
oss << "--" << boundary << "\r\n" 
     "Content-Disposition: form-data; name=\"ID\"\r\n" 
     "\r\n" 
     << id << "\r\n" 
     "--" << boundary << "\r\n" 
     "Content-Disposition: form-data; name=\"Password\"\r\n" 
     "\r\n" 
     << psw << "\r\n" 
     "--" << boundary << "--\r\n"; 

std::string senddata = oss.str(); 

oss.str(""); 
oss.clear(); 

oss << "POST/HTTP/1.1\r\n" 
     "Host: " << host << "\r\n" 
     "Accept: text/html, application/xhtml+xml\r\n" 
     "Content-Type: multipart/form-data; boundary=" << boundary << "\r\n" 
     "Content-Length: " << senddata.size() << "\r\n" 
     "Accept-Encoding: gzip, deflate\r\n" 
     "Keep-Alive: 30\r\n" 
     "Connection: Keep-Alive\r\n" 
     "\r\n" 
     << senddata; 

std::string sendbuf = oss.str(); 

// use sendbuf.c_str() and sendbuf.size() as needed... 

прочитанной РЛК 2045, 2046, 2047, 2048 и 2049 для официального MIME спецификации.

HTML спецификации W3C, прочитанное (HTML4 и HTML5), а также RFC 2388, о том, как форматировать multipart/form-data данных.

Что касается файлов cookie, они отправляются вам в ответе HTTP, и вы отправляете их обратно в последующих запросах на один и тот же сервер/путь. Прочитайте RFC 6265 для официальной спецификации печенья.

+0

Спасибо! я ценю это. теперь им становится все дальше. за исключением того, что сервер 501 не реализован, GET to index.html не поддерживается. Я понимаю это. индексная страница не предназначена для ввода данных. ive изменил мой заголовок на «POST \ member.php HTTP/1.1 \ r \ n» и все еще получил ошибку. плохо продолжать google. Оказывается, я успешно вошел в систему, хотя. –