我用下面的代码连接到服务器
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";