Я пытаюсь отправить HTML-страницу через WebSocket, используя C ++
EDIT: I've updated the response header to **not** specify
how many characters are being sent via char response[] = "...";
I've added to the header the Content-Type and Content-Length headers
with length value being 1024. The result is still the same.
The server sends the response to the web page client and the
web page prints the header information instead of using the HTML tags.
Я знаю, что C ++ не совсем предпочтительный язык для этого, но это языкЯ должен использовать.
Мне уже удалось "установить?"соединение с веб-страницей клиента в Google Chrome. Сервер получает первоначальный запрос от клиента и может отправить ответ, который принимает клиент.Это просто неверная часть.
Заголовок запроса:
- Хост: hostinfo.com:8xxx
- Соединение: keep-alive
- Запрос на обновление-небезопасность: 1
- DNT: 1
- Пользователь-агент: Mozilla / 5.0 (chrome и т. Д.)
- Принимать: (зашифрованное сообщение)
Ответ сервера:
- HTTP / 1.1 200 OK
- Upgrade-Insecure-Request: 1
- Соединение: keep-alive
- Content-Length: 1024
- Content-Type: text / html
- (пространство для разделения заголовка и информации HTML с использованием \r \ n \ r \ n (пробел после n))
- test
- (и ответ на конечной странице \ r \ n \ r \ n (пробел после n)
Однако, когда веб-страница подключается, вместо отображения «теста» отображает весь набор символов в заголовке, включая «HTTP / 1.1 200 OK ... и т. Д.»
Я новичок в протоколах HTTP и рукопожатиях, я достиг этой точки всего за несколько дней, используяg статей типа this и this и чтения RFC-индексов , но, похоже, нет ответов на эту конкретную проблему.Я мог понять ошибки рукопожатия, которые привели к невозможности передачи данных между сервером и клиентом, но отправка заголовка вместо HTML-кода мне не подходит.Спасибо за любую помощь / понимание.
TLDR: Почему клиент отображает информацию заголовка, а не использует HTML-код для отображения HTML-страницы?
HTML на стороне клиента:
<form action="http://xxxxxxx.com:8xxx" method="POST">
<div>
<input>
</div>
<div>
<button>Test Connection</button>
</div>
</form>
Код C ++ на стороне сервера: файл заголовка
#pragma once
#undef UNICODE
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
// Need to link with Ws2_32.lib
#pragma comment (lib, "Ws2_32.lib")
// #pragma comment (lib, "Mswsock.lib")
class html_connection
{
public:
static int client_handler_thread(int index);
static int server();
};
Код C ++ на стороне сервера:Файл класса
#include "pch.h"
#include "html_connection.h"
#pragma warning(disable : 4996)
SOCKET Connections[100]; // client threads (up to 100)
int ConnectionCounter = 0;
int html_connection::server()
{
WSADATA ws;
WORD dllV = MAKEWORD(2, 1);
if (WSAStartup(dllV, &ws) != 0)
{
MessageBoxA(NULL, "Winsock startup failed", "Error", MB_OK | MB_ICONERROR);
}
SOCKADDR_IN addr; // create an address
int addrSize = sizeof(addr); //length of address
addr.sin_addr.s_addr = inet_addr("xxx.x.x.xx"); //Broadcast IP
addr.sin_port = htons(8000); //Port
addr.sin_family = AF_INET; // IPv4 socket
SOCKET s = socket(AF_INET, SOCK_STREAM, NULL); // listener socket
bind(s, (SOCKADDR*)&addr, sizeof(addr)); // binds address to socket
listen(s, SOMAXCONN); // max possible listeners
SOCKET newC; // client socket
for (int i = 0; i < 100; i++) // ensures limited number of clients can connect
{
newC = accept(s, (SOCKADDR*)&addr, &addrSize); // connect
if (newC == 0) // if client con failed
{
std::cout << "connect failed" << std::endl;
}
else // connected
{
Connections[i] = newC; // store new connection in array of connections
ConnectionCounter += 1;
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)client_handler_thread, (LPVOID)(i), NULL, NULL);
}
}
return 0;
}
int html_connection::client_handler_thread(int index)
{
// buffer for the client request
char clientInput[256];
// Response to the client
char response[] = "HTTP/1.1 200 OK \r\n Connection: keep-alive \r\n Content-Length:1024 \r\n Upgrade-Insecure-Requests: 1 \r\n Content-Type: text/html \r\n \r\n\r\n <html> </html> \r\n\r\n ";
while (true)
{
// gets the request from the client and prints it to the console
recv(Connections[index], clientInput, sizeof(clientInput), 0);
std::cout << clientInput << std::endl;
// send server response
send(Connections[index], response, sizeof(response), 0);
}
closesocket(Connections[index]);
}
Вывод: клиент - веб-страница (начальная страница - предварительный запрос)
Вывод: клиент - веб-страница (пост-запрос)
Вывод: сервер - консольный вывод (соединение с одним клиентом)