C ++ WinSock错误10053

时间:2013-07-12 20:32:45

标签: 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
...

它有什么问题以及如何解决?

2 个答案:

答案 0 :(得分:4)

假设在收到每个HTTP响应后连接保持打开状态,但无法保证。您必须查看服务器的实际HTTP响应(具体来说,在状态行中报告的HTTP版本,以及Connection标头),以了解服务器是否正在打开连接。

您正在发送HTTP 1.1请求,但无法保证服务器将使用HTTP 1.1响应进行回复。

如果响应使用HTTP 0.9,则必须关闭套接字并重新连接,然后再发送下一个HTTP请求。

如果响应正在使用HTTP 1.0,并且Connection标头没有说keep-alive,那么必须关闭套接字并重新连接,然后再发送下一个HTTP请求

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

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

答案 1 :(得分:2)

好的,所以来自this page 10053的内容如下:

10053 WSAECONNABORTED

软件导致连接中止。 已建立的连接被主机中的软件中止, 可能是由于数据传输超时或协议错误。

你对另一端机器有什么了解?可能关闭连接?我不确定这是否会产生这个错误。

您是否尝试过关闭并重新建立循环中的连接?

while(1)
{
  connect ( socket_body, (struct sockaddr*)&destaddr, sizeof(sockaddr) );
  send(socket_body, "GET / HTTP/1.1\r\nHost: ya.ru\r\n\r\n", 31, 0);
  S leep(100);
  n = recv(socket_body, buf, 20000, 0);
  printf("%d, %d\n", GetLastError(), n);
  close(socket_body);
  //if (n>0) printf("%s", buf);
  Sleep(1000);
}