我想构建一个超级简单的Web服务器,起初只是传输一个字符串,无论请求的地址是什么,在这种情况下都是“ Hello Web”。
我从这里修改了代码:https://causeyourestuck.io/2016/01/17/socket-cc-windows/。目前,它告诉我在127.0.0.1:5555上的服务器上,chrome中存在HTTP响应错误。
服务器代码:
#include <iostream>
#include <winsock2.h>
using namespace std;
int main()
{
WSADATA WSAData;
SOCKET server, client;
SOCKADDR_IN serverAddr, clientAddr;
WSAStartup(MAKEWORD(2,0), &WSAData);
server = socket(AF_INET, SOCK_STREAM, 0);
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(5555);
bind(server, (SOCKADDR *)&serverAddr, sizeof(serverAddr));
listen(server, 0);
cout << "Listening for incoming connections..." << endl;
char buffer[1024];
int clientAddrSize = sizeof(clientAddr);
if((client = accept(server, (SOCKADDR *)&clientAddr, &clientAddrSize)) != INVALID_SOCKET)
{
cout << "Client connected!" << endl;
recv(client, buffer, sizeof(buffer), 0);
cout << "Client says: " << string(buffer) << endl;
string response = "Hello Web\r\n";
send(client, response.c_str(), response.size(), 0);
cout << "msg send: " << response << endl;
memset(buffer, 0, sizeof(buffer));
closesocket(client);
cout << "Client disconnected." << endl;
}
}
recv(client, buffer, sizeof(buffer), 0);
cout << "Client says: " << string(buffer) << endl;
您忽略recv
的返回值。您如何期望下一行代码知道要输出多少字节的数据?
而且,也无法保证对recv
的单次调用将获得整个查询。它可能只获得一小部分标题。
string response = "Hello Web\r\n";
send(client, response.c_str(), response.size(), 0);
这可能不是有效的HTTP响应,但是我们无法确定。您的代码不会查看查询,例如查看查询的版本。这可能是有效的HTTP 0.9响应,但肯定不是有效的HTTP 1.0响应。