В ответе сервера C ++ отображается информация заголовка на странице клиента WebSocket Winsock Windows VS - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь отправить 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]);
}

Вывод: клиент - веб-страница (начальная страница - предварительный запрос) enter image description here

Вывод: клиент - веб-страница (пост-запрос) enter image description here

Вывод: сервер - консольный вывод (соединение с одним клиентом) enter image description here

...