我试图从当前目录提供一个 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;
}
在看到该页面一瞬间后,我确实没想到会出现此错误
问题在于您没有告诉客户端(浏览器)响应何时完成。 您必须发送:
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);
}