[英]Website not responding when sending a GET request using low level c++ networking libraries
我正在尝试创建一个使用 C++ 低级网络从网站下载数据的程序。 这是代码:
#include <iostream>
#include <string>
#include <string.h>
#include <netdb.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int status, sock;
struct addrinfo hints;
struct addrinfo *servinfo;
int main(int argc, char** argv){
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
int MAXDATASIZE = 100;
char request[] = "GET /robots.txt HTTP/1.1\n";
char buf[MAXDATASIZE];
if((status = getaddrinfo(argv[1], argv[2], &hints, &servinfo)) != 0){
std::cout << "getaddrinfo: " << gai_strerror(status) << "\n";
return 2;
}
if((sock = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) == -1){
std::cout << "Error creating socket\n";
return 2;
}
if(connect(sock, servinfo->ai_addr, servinfo->ai_addrlen) == -1){
std::cout << "Error connecting to host " << argv[1] << " at port " << argv[2] << "\n";
return 2;
}
if((send(sock, request,strlen(request), 0)) == -1){
std::cout << "Error communicating with website\n";
return 2;
}
if(recv(sock, buf, MAXDATASIZE, 0) == -1){
std::cout << "Error recciving data from " << argv[1] << " at port " << argv[2] << "\n";
}
std::cout << buf << std::endl;
close(sock);
freeaddrinfo(servinfo);
}
当我尝试连接到谷歌时,使用www.google.com作为主机和 80 作为端口,它挂在 recv() 调用处。为了测试请求是否是问题,我使用 telnet 连接到谷歌请求,它奏效了。 我还尝试将 netcat 绑定到我计算机上的一个端口,然后使用我的程序连接到该端口。 请求被正确发送到 netcat,当我用测试消息响应时,我的程序收到了它。
有谁知道为什么谷歌不发送数据?
我正在使用 Fedora 32,如果这可能有帮助的话
您的软件没有挂起。 相反,服务器正在等待客户端已完成发送标头的指示,这通过发送空行来指示。 在客户端发送空行之前,服务器无法响应。
将您的请求更改为:
char request[] = "GET /robots.txt HTTP/1.1\r\n\r\n";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.