使用C++加载页面错误服务html

问题描述 投票:0回答:1

我试图从当前目录提供一个 index.html 文件(为了测试目的,我将其更改为“Hello”),我看到该页面一瞬间,然后它给了我这个: 连接已重置

The connection to the server was reset while the page was loading.

    The site could be temporarily unavailable or too busy. Try again in a few moments.
    If you are unable to load any pages, check your computer’s network connection.
    If your computer or network is protected by a firewall or proxy, make sure that Firefox is permitted to access the web.

我确实尝试了他们建议的所有内容,但没有成功,而且我无法获得有关此特定主题的足够文档,这里是 server.cpp:

#include <tchar.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>
#include <thread>
#include <string>

void handleClient(SOCKET acceptSocket) {
    std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello";

    int bytesSent = send(acceptSocket, response.c_str(), response.size(), 0);
    if (bytesSent == SOCKET_ERROR) {
        std::cerr << "Error sending data to client: " << WSAGetLastError() << std::endl;
    } else {
        std::cout << "Served 'Hello' to client." << std::endl;
    }

    closesocket(acceptSocket);
}

int main() {
    SOCKET serverSocket, acceptSocket;
    const int PORT = 55555;
    WSADATA wsaData;
    WORD wVersionRequested = MAKEWORD(2, 2);
    int wsaerr = WSAStartup(wVersionRequested, &wsaData);

    if (wsaerr != 0) {
        std::cerr << "Winsock dll not found." << std::endl;
        return 0;
    } else {
        std::cout << "Winsock dll was found!" << std::endl;
        std::cout << "Status: " << wsaData.szSystemStatus << std::endl;
    }

    serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (serverSocket == INVALID_SOCKET) {
        std::cerr << "Error at socket()." << std::endl;
        WSACleanup();
        return 0;
    } else {
        std::cout << "Socket() is OK!" << std::endl;
    }

    sockaddr_in service;
    service.sin_family = AF_INET;
    InetPton(AF_INET, _T("127.0.0.1"), &service.sin_addr.s_addr);
    service.sin_port = htons(PORT);

    if (bind(serverSocket, (SOCKADDR*)&service, sizeof(service)) == SOCKET_ERROR) {
        std::cerr << "bind() failed." << std::endl;
        std::cerr << WSAGetLastError() << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 0;
    } else {
        std::cout << "bind() is OK!" << std::endl;
    }

    if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) {
        std::cerr << "listen() error listening on socket." << std::endl;
        closesocket(serverSocket);
        WSACleanup();
        return 0;
    } else {
        std::cout << "listen() is OK!, waiting for connections.." << std::endl;
    }

    while (true) {
        acceptSocket = accept(serverSocket, NULL, NULL);
        if (acceptSocket == INVALID_SOCKET) {
            std::cerr << "accept failed." << std::endl;
            std::cerr << WSAGetLastError() << std::endl;
            closesocket(serverSocket);
            WSACleanup();
            return -1;
        }
        std::cout << "Client connected.." << std::endl;

        handleClient(acceptSocket);
    }

    closesocket(serverSocket);
    WSACleanup();

    return 0;
}

在看到该页面一瞬间后,我确实没想到会出现此错误

c++ firefox server localhost
1个回答
0
投票

问题在于您没有告诉客户端(浏览器)响应何时完成。 您必须发送:

  • a

    Content-Length
    标头,指定发送的实际字节数。

  • a

    Transfer-Encoding: chucked
    标头,后跟数据块,以 0 长度块终止。

此外,由于您在发送响应后关闭连接,因此您应该发送一个

Connection: close
标头,以便客户端知道在响应完成后关闭连接。

试试这个:

void handleClient(SOCKET acceptSocket) {
    std::string response = "HTTP/1.1 200 OK\r\n"
                           "Content-Type: text/plain\r\n"
                           "Content-Length: 5\r\n"
                           "Connection: close\r\n"
                           "\r\n"
                           "Hello";

    const char *data = response.c_str();
    size_t size = response.size();
    while (size > 0) {
        int bytesSent = send(acceptSocket, data, size, 0);
        if (bytesSent == SOCKET_ERROR) {
            std::cerr << "Error sending data to client: " << WSAGetLastError() << std::endl;
            break;
        }
        data += bytesSent;
        size -= bytesSent;
    }

    if (size == 0)
        std::cout << "Served 'Hello' to client." << std::endl;

    closesocket(acceptSocket);
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.