首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有保持活力的recv函数块(HTTP)

具有保持活力的recv函数块(HTTP)
EN

Stack Overflow用户
提问于 2015-09-22 07:13:12
回答 1查看 278关注 0票数 0

我正在学习Windows中的套接字,也就是HTTP协议。所以我在做一些关于保持生命的测试,但是由于某种原因,recv挂起了大约5秒,如下所示:

代码语言:javascript
运行
复制
VOID TestWinsock()
{
    WSADATA WsaData;
    addrinfo hints;
    addrinfo* hResult;
    SOCKET hsocket;
    int Result;

    WSAStartup(MAKEWORD(2, 2), &WsaData);
    RtlZeroMemory(&hints, sizeof(hints));

    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    Result = getaddrinfo("localhost", "80", &hints, &hResult);
    if (Result != 0)
    {
        return;
    }

    hsocket = socket(hResult->ai_family, hResult->ai_socktype, hResult->ai_protocol);
    if (hsocket == INVALID_SOCKET)
    {
        return;
    }

    Result = connect(hsocket, hResult->ai_addr, (int)hResult->ai_addrlen);
    if (Result == SOCKET_ERROR)
    {
        return;
    }

    char* POSTContent;
    char HTTPRequestBuffer[1024];
    char RecvBuffer[1024];

    char* HTTPRequest =
        "POST %s HTTP/1.0\r\n"
        "Host: %s\r\n"
        "connection: keep-alive\r\n"
        "Content-type: application/x-www-form-urlencoded\r\n"
        "Content-Length: %u\r\n"
        "\r\n"
        "%s"
        "\r\n"
        "\r\n";

    POSTContent = "variable1=10";
    wsprintfA(
        HTTPRequestBuffer,
        HTTPRequest,
        "/tests/test.php",
        "127.0.0.1",
        strlen(POSTContent),
        POSTContent
        );

    int sent = send(hsocket, HTTPRequestBuffer, strlen(HTTPRequestBuffer), 0);
    RtlZeroMemory(RecvBuffer, sizeof(RecvBuffer));

    // here recv blocks for about 5 seconds, yeah, it reads only 100 bytes, tried with something like sizeof(RecvBuffer) as well.
    recv(hsocket, RecvBuffer, 100, 0);

    ....
}

我想知道如何解决这个问题,或者用什么方法来维持生命。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-22 08:34:50

在您的HTTP请求中,您发送了一个没有包含在您的\r\n\r\n中的额外的Content-Length,因此数据和宣布的长度不匹配。HTTP标准指出:

当在允许消息体的消息中给出内容长度时,其字段值必须与消息体中的八进制数完全匹配。

MUST很重要,这意味着服务器完全有权拒绝您的请求。您指定的keep-alive也可能意味着服务器等待下一个有效的请求。因为您只发送了4个字节,所以服务器在5s之后就会关闭连接,并且可能会发送一个错误(这部分只是猜测实际发生了什么)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32710593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档