Winsock服务器页面在recv()上挂起

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

我正在尝试使用Winsock在简单的Web服务器上处理获取请求。在浏览器窗口中打开页面时,该页面将首次挂起,并在第二次运行。刷新几次后,页面仍然挂起。是什么原因造成的?

while( (new_socket = accept(s , (struct sockaddr *)&client, &c)) != INVALID_SOCKET ){
    recv(new_socket, buffer, 500, 0);

    for(int i = 4; i< 30; i++){
        buffer3[i-5] = buffer[i];
    }

    a = "HTTP/1.1 200 OK\r\nDate: Sun, 19 May 2018 08:56:53 GMT\r\nServer: Apache/2.2.14 (Win32)\r\nLast-Modified: Sat, 20 Nov 2004 07:16:26 GMT\r\nETag: \"10000000565a5-2c-3e94b66c2e680\"\r\nAccept-Ranges: bytes\r\nContent-Length: 46\r\nConnection: close\r\nContent-Type: text/html\r\nX-Pad: avoid browser bug";
    b = "\r\n\r\n<html><body><h1>It works!";
    d = "</h1></body></html>\r\n";

    strncpy(buffer2, a, sizeof(buffer2));
    strncat(buffer2, b, sizeof(buffer2));
    strncat(buffer2, buffer3, sizeof(buffer2));
    strncat(buffer2, d, sizeof(buffer2));

    puts( buffer2 );

    message = buffer2;

    send(new_socket , message , strlen(message) , 0);

}
c++ get winsock recv
1个回答
0
投票

您正在以阻止模式使用套接字。您已要求接收500个字节。在数据可用或发生错误之前,recv调用将被阻止。

您应该将套接字设置为非阻塞模式并处理ERETRY / EINPROGRESS / WSAEWOULDBLOCK错误,或使用select等待直到有一些数据要从套接字读取。

而且,您的代码中没有错误处理,并且不清楚s的来源(我猜测这是bind /绑定的套接字,并且是listen /监听的套接字。] >

[请注意,不保存接收到的大小是一个主要错误(您可能只接收了1个字节的查询,但稍后使用了30个字节)。客户端关闭另一端的套接字也会导致该服务器为recv返回0。

请注意,分配的缓冲区与其使用的大小之间存在差异。因此,sizeof(buffer)给出了您声明​​的大小(因此char buffer[64]; strcpy(buffer, "abc");为64,而不是3。如果需要内容大小,则需要使用strlen

我将建议您阅读一些现有的服务器/客户端代码并添加错误处理,最后您将获得很多时间,这里的错误可以帮助您诊断问题。

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