使用套接字的C ++ HTTP GET

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

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 

尽pipe指标等于请求长度。

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

HTTP请求(和回复)头以序列\r\n\r\n结尾; 标题中的各行用单独的\r\n分隔。 所以你需要的是:

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

你实际上不需要协议和IP地址 – 你已经连接 – 所以这可以减少到:

 string request("GET /sensor?value=10.3\r\n\r\n"); 

短版本实际上更好(也更规范),因为这样做会降低服务器的复杂性。

你可以像下面这样使用boost asio:

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