2017-04-15 2 views
0

Mit Boost-Asio I einfachen Code vorbereitet:ich TCP Anforderung an HTTP-Server senden - aber sie haben keine Antwort

asio::io_service io_service; 

asio::ip::tcp::socket s(io_service); 
asio::ip::tcp::resolver resolver(io_service); 
asio::connect(s, resolver.resolve({ "aire.pl", "80" })); 

cout << "connected" << endl; 

string request = "GET http://aire.pl/ HTTP/1.1"; 
size_t request_length = std::strlen(request.c_str()); 
asio::write(s, asio::buffer(request, request_length)); 

cout << "packet sent" << endl; 

char reply[1024]; 
size_t reply_length = asio::read(s, asio::buffer(reply, request_length)); 
std::cout << "Reply is: "; 
std::cout.write(reply, reply_length); 
std::cout << "\n"; 

Alles scheint gut zu funktionieren, weil tcp-dump kann ich meine Pakete sehen

enter image description here

Aber ich habe keine Antwort: dass das Programm gesendet. Die eine interessante Tatsache ist, dass, wenn der HTTP-Server nginx ist, es funktioniert! In diesem Beispiel ist der HTTP-Server Apache2. Was ist los mit dir?

+1

Haben Sie mithilfe von Wireshark oder einer ähnlichen Software überprüft, ob Sie überhaupt eine Antwort erhalten? – CurlyCorvus

+2

Sie senden besser eine HTTP-Anfrage, keine TCP-Anfrage. Du hast nicht, ganz. Sie brauchen '\ r \ n \ r \ n' am Ende davon. – EJP

Antwort

2

Sie haben anscheinend keine vollständige HTTP-Anfrage gesendet. Auf die Zeile GET folgen optionale Header, gefolgt von einer leeren Zeile, um das Ende der Header anzuzeigen. Auch wenn Sie keine Header senden möchten, müssen Sie die leere Zeile senden, damit der Server weiß, dass er die gesamte Anfrage erhalten hat.

Fügen Sie \r\n\r\n am Ende Ihrer request Zeichenfolge hinzu.

Verwandte Themen