c ++网络服务器未正确发送数据

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

我想构建一个超级简单的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;
    }
}
c++ winsock
1个回答
0
投票
    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响应。

© www.soinside.com 2019 - 2024. All rights reserved.