gpt4 book ai didi

c++ - Winsock服务器页面卡在recv()上

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:25 26 4
gpt4 key购买 nike

我正在尝试使用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);

}

最佳答案

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

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

另外,您的代码中没有错误处理,并且不清楚s的来源(我猜想它是bind / bound且是listen / listening的套接字)。

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

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

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

关于c++ - Winsock服务器页面卡在recv()上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58881937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com