C++ WinSock 错误 10053

标签 c++ sockets winsock

套接字应用程序有问题。它必须多次从“ya.ru”检索 html 起始页,但在第一次之后,我立即收到套接字错误 10053。 请看代码:

#include <stdio.h>
#include <winsock2.h>
int main()
{
WSADATA winsock_data;
WSAStartup (MAKEWORD (2, 0), &winsock_data);

SOCKET socket_body;
socket_body = socket (PF_INET, 1, 0);

struct timeval to;
to.tv_sec = 5000;
to.tv_usec = 0;
setsockopt(socket_body, SOL_SOCKET, SO_RCVTIMEO, (char *)&to, sizeof(struct timeval));

sockaddr_in destaddr;
destaddr.sin_family = PF_INET;
destaddr.sin_port = htons( 80 );
destaddr.sin_addr.s_addr = inet_addr( "93.158.134.3" );
connect ( socket_body, (struct sockaddr*)&destaddr, sizeof(sockaddr) );

char* buf = (char*)malloc(20000);
int n;
while(1)
{
    send(socket_body, "GET / HTTP/1.1\r\nHost: ya.ru\r\n\r\n", 31, 0);
    Sleep(100);
    n = recv(socket_body, buf, 20000, 0);
    printf("%d, %d\n", GetLastError(), n);
    //if (n>0) printf("%s", buf);
    Sleep(1000);
}
}

WSAStartup、socket()、setsockopt() 和 connect() 不会导致错误。防火墙(如 Windows 防火墙)和 AV 软件不工作。所以输出是:

0, 8386
0, 0
10053, -1
10053, -1
...

它有什么问题,如何解决?

最佳答案

假设在收到每个 HTTP 响应后连接保持打开状态,但不能保证这一点。您必须查看服务器的实际 HTTP 响应(具体而言,状态行中报告的 HTTP 版本以及 Connection header )以了解服务器是否保持连接打开。

您发送的是 HTTP 1.1 请求,但不能保证服务器会回复 HTTP 1.1 响应。

如果响应使用 HTTP 0.9,您必须关闭套接字并在发送下一个 HTTP 请求之前重新连接。

如果响应使用 HTTP 1.0,并且如果 Connection header 没有说明 keep-alive,那么您必须关闭套接字并在发送下一个 HTTP 请求之前重新连接。

如果响应使用的是 HTTP 1.1,并且如果 Connection header 没有说明 close,则服务器在其端保持连接打开,您可以重复使用下一个请求的相同连接。但是,在实际发送下一个 HTTP 请求之前,您仍然需要考虑连接可能在外部(通过防火墙/路由器/代理等)关闭的可能性。

因此在 HTTP 1.0 或 1.1 的情况下,如果您希望连接保持打开状态,但 send() 失败并显示连接丢失的错误,只需关闭套接字并重新连接,然后再次发送相同的 HTTP 请求。

关于C++ WinSock 错误 10053,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17623563/

相关文章:

c++ - 令人困惑的私有(private)变量访问

c++ - 如何提取__VA_ARGS__?

python - 从单个长字符串创建列表

c++ - UDP 传输和维护网络字节顺序

perl - 多个系统读取导致以下系统写入在 Perl 中失败

java - 在 C 中实现 Java 的 getResponseCode() ?

c++ - Winsock 多客户端多线程,电脑辛苦了

c++ - 如何从套接字读取中接收自定义数据类型?

c++ - 将库代码添加到您的项目,或使用预编译的二进制文件?

c - Winsock recv() 没有收到任何数据 (C)