2

套接字应用程序有问题。它必须多次从“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
...

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

4

2 回答 2

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 请求。

于 2013-07-13T02:15:01.463 回答
2

好的,所以从这个页面10053 如下:

第10053章

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

你对另一端的机器了解多少?它可能正在关闭连接吗?我不确定这是否会产生此错误。

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

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);
}
于 2013-07-12T20:43:58.600 回答