使用套接字的c++ HTTP GET

C++ HTTP GET using socket

本文关键字:HTTP GET c++ 套接字      更新时间:2023-10-16

我用下面的代码连接到服务器

 web_socket = socket(AF_INET, SOCK_STREAM, 0);
 memset(&server_address, 0, sizeof(struct sockaddr_in));
 inet_pton(AF_inet, "166.111.1.1", &server_address.sin_addr);
 server_address.sin_family = AF_INET;
 server_address.sin_port = htons(8080);
 indicator = connect(web_socket, (struct sockaddr *) &server_address, sizeof(server_address));

执行上面的代码导致指示器为0,这意味着连接到服务器是成功的,但是当我试图写

 string request = "GET http://166.111.1.1:8080/sensor?value=10.3";
 indicator = write(web_socket, request.c_str(), request.length());

下面什么也看不见
 http://166.111.1.1:8080/sensor?value=10.3

 http://166.111.1.1:8080/sensor

虽然指示符等于请求长度。

上面的代码有什么问题吗?我正在测试Ubuntu 12.04使用QT Creator, GCC

HTTP请求(和应答)报头以序列rnrn终止;标头内的各个行用单个rn分隔。所以你需要的是:

string request("GET http://166.111.1.1:8080/sensor?value=10.3rnrn");

你实际上不需要协议和IP地址在那里——你已经连接了——所以这可以简化为:

string request("GET /sensor?value=10.3rnrn");

短版本实际上更好(也更规范),因为它与服务器的复杂性更低。

您可以像下面这样使用boost:

boost::asio::ip::tcp::iostream  stream;
stream.connect(166.111.1.1, 8080);
stream << "GET /sensor?value=10.3 HTTP/1.1rn";
stream << "Accept: */*rn";
stream << "Connection: closern";
stream << "rn";