套接字应用程序出现问题。它必须多次从“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
...
它有什么问题以及如何解决?
答案 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);
}