套接字"Resource temporarily unavailable"的原始 HTTP 请求
Raw HTTP request with sockets getting "Resource temporarily unavailable"
我正在尝试使用" C "中的套接字制作RAW HTTP请求功能。一切都很好,直到我看到我没有超时的功能,例如。当我在没有80个打开的IP上执行请求时,它会永远停留,因此我决定进行超时,而是使用blocking
插座,我开始使用non-blocking
。有问题开始。请参阅代码:
代码:
size_t raw_http(char *host,char *ip, int port, char *page, char *content, size_t len)
{
int sock;
if(debug_super_http >= 5) puts("AAAA");
// sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock < 0)
{
if(debug_super_http >= 5) puts("BBBB");
//printf("raw_http() ~ socket opening failed.n");
// exit(1);
return 0;
}
perror("socket");
struct sockaddr_in remote ;
remote.sin_family = AF_INET;
remote.sin_port = htons(port);
remote.sin_addr.s_addr = inet_addr(ip);
fd_set fdset;
struct timeval tv;
fcntl(sock, F_SETFL, O_NONBLOCK);
if(debug_super_http >= 4) puts("CCCC");
perror("socket");
connect(sock,(struct sockaddr*)(&remote),sizeof(struct sockaddr_in));
perror("socket");
FD_ZERO(&fdset);
FD_SET(sock, &fdset);
tv.tv_sec = 10;
tv.tv_usec = 0;
if(select(sock + 1, NULL, &fdset, NULL, &tv) == 1)
{
int so_error;
socklen_t len = sizeof so_error;
getsockopt(sock, SOL_SOCKET, SO_ERROR, &so_error, &len);
if (so_error == 0)
{
//Is connected
if(debug_super_http >= 4) puts("EEEE");
perror("socket");
}
else
{
if(debug_super_http >= 4) puts("FFFF");
perror("socket");
}
}
else
{
if(debug_super_http >= 4) puts("GGGGG");
perror("socket");
}
/*
if(debug_super_http >= 5) puts("33333");
if(inet_pton(AF_INET, ip, (void *)(&(remote.sin_addr.s_addr))) <= 0)
{
//printf("raw_http() ~ inet_pton() failed.n");
// exit(1);
return 0;
}
remote.sin_port = htons(port);
*/
if(debug_super_http >= 5) puts("44444");
perror("socket");
/*
if(connect(sock, (struct sockaddr *)&remote, sizeof(struct sockaddr)) < 0)
{
if(debug_super_http >= 5) puts("555555");
//printf("raw_http() ~ socket connection failed.n");
// exit(1);
return 0;
}
*/
if(debug_super_http >= 5) puts("666666");
//build_get_query
char *getpage = page;
if(getpage[0] == '/') getpage = getpage + 1;
char getcmd[4096];
sprintf(getcmd, "GET /%s HTTP/1.0rnHost: %srnUser-Agent: %srnrn", getpage, host, USERAGENT);
if(debug_super_http >= 5) puts("7777777");
perror("socket");
size_t sent = 0;
while(sent < strlen(getcmd))
{
if(debug_super_http >= 5) puts("8888888");
perror("socket");
ssize_t tmpres = send(sock, getcmd+sent, strlen(getcmd)-sent, 0);
printf("tmpres=[%d]n",tmpres);
if(tmpres == -1)
{
// printf("raw_http() ~ http get command sending error.n");
if(debug_super_http >= 5) puts("8.5 8.5 8.5");
// exit(1);
return 0;
}
sent += tmpres;
if(debug_super_http >= 5) puts("8.7 8.7 8.7");
}
if(debug_super_http >= 5) puts("9999999");
perror("socket");
char buf[8192];
memset(buf, 0, 8192);
// initialize html content buffer
memset(content, 0, len);
/*
#if 0
htmlcontent[0] = ' ';
return 0;
#endif
*/
int htmlstart = 0;
printf("recv->[%d]n",recv(sock, buf, 8192, 0));
fprintf(stderr, "socket() failed: %sn", strerror(errno));
perror("socket");
while(recv(sock, buf, 8192, MSG_WAITALL) > 0)
{
// if(debug_super_http >= 5) printf(">>> [%s]n",buf);
if(debug_super_http >= 5) puts("10 10 10");
// receive max 1KB
if(htmlstart == 0)
{
char *ptr = strstr(buf, "rnrn");
if(ptr != NULL)
{
htmlstart = 1;
ptr += 4;
strcat(content, ptr);
}
}
else
{
strcat(content, buf);
break;
}
memset(buf, 0, 8192);
}
perror("socket");
if(debug_super_http >= 5) printf(">>> CONTENT >>> [%s]n",content);
if(debug_super_http >= 5) puts("11 11 11");
close(sock);
if(debug_super_http >= 5) puts("12 12 12");
perror("socket");
return strlen(content);
}
我在HTTP服务器上获取请求,但我从未得到响应。在浏览器中测试了它,WGET,Curl似乎是问题在于它没有输入while(recv(sock, buf, 8192, 0) > 0)
循环,但正在提出请求。它基本上给了我Resource temporarily unavailable
。
输出:
AAAA
socket: Success
CCCC
socket: Illegal seek
socket: Operation now in progress
EEEE
socket: Illegal seek
44444
socket: Illegal seek
666666
7777777
socket: Illegal seek
8888888
socket: Illegal seek
tmpres=[133]
8.7 8.7 8.7
9999999
socket: Illegal seek
recv->[-1]
socket() failed: Resource temporarily unavailable
socket: Resource temporarily unavailable
socket: Resource temporarily unavailable
>>> CONTENT >>> []
11 11 11
12 12 12
socket: Resource temporarily unavailable
编辑
puts(getcmd);
是:
GET /script.php?v=qqqqq HTTP/1.0
Host: 1.2.3.4
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; rv:2.2) Gecko/20110201
(here is /r/n/r/n probably)
有提示吗?
谢谢!
我在
if(select(sock + 1, NULL, &fdset, NULL, &tv) == 1) ...
零件之后做了fcntl(sock, F_SETFL);
,但我仍然没有内容
您不得省略fcntl(sock, F_SETFL, …)
调用的第三 arg ;要删除O_NONBLOCK
标志,您可以致电fcntl(sock, F_SETFL, 0)
。
此外,您不得省略第一个connect
之后的第二个connect
呼叫,现在正在进行中操作,因此请删除第二个呼叫的评论。
此外,线
printf("recv->[%d]n",recv(sock, buf, 8192, 0));
已经收到网页内容的第一个块(或整个内容,如果足够小),但是您丢弃了buf
中的内容,并且不显示收到的内容。
相关文章:
- 如何在boost beast http请求中设置http头
- 将浮动的heightmap数组导出为16位原始值
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 在多个核心中处理一个HTTP请求
- SFML library: http request
- 有没有办法从非C/C++文件中读取C++原始字符串文字的内容
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 如何将原始字节附加到 std::vector?
- 从堆栈分配的原始指针构造智能指针
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 将unique_ptr分配给原始指针
- 使用 Winsock2.h C++向不和谐 API 发送 HTTP 请求时出现问题
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 使用 OpenSSL 从内存中读取原始 SSL/TLS 证书
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 从原始字节解码协议缓冲区(以 C++为单位)
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- C++:尝试使用等效的 STL 算法消除原始循环
- 如何在连接器 C++ 中将原始字节转换为字符串
- 套接字"Resource temporarily unavailable"的原始 HTTP 请求