2017-07-02 3 views
1

Ich habe zwei einfache Client- und Server-Beispiel implementiert, aber es funktioniert nicht. Sowohl der Client als auch der Server frieren einfach ein, ohne dass Nachrichten gedruckt werden.Wie boost.asio verwendet wird, um Daten zwischen Client und Server hin- und herzuwechseln?

client.cpp

int main(int argc, char * argv[]) 
{ 
std::string raw_ip = "127.0.0.1"; 
int port = 3333; 
try 
    { 
    asio::ip::tcp::endpoint 
     ep(asio::ip::address::from_string(raw_ip), port); 
    asio::io_service ios; 
    asio::ip::tcp::socket sock(ios, ep.protocol()); 
    sock.connect(ep); 

    asio::streambuf request; 
    std::ostream request_stream(&request); 
    request_stream << "request from clinet\n"; 
    asio::streambuf response; 
    asio::read_until(sock, response, "\n"); 
    std::istream response_stream(&response); 
    std::cout << response_stream.rdbuf() << std::endl; 
    } 
    catch(system::system_error &e) 
    { 
    std::cout << "Encounter error: " << e.what() << std::endl; 
    return e.code().value(); 
    } 
} 

server.cpp

int main(int argc, char * argv[]) 
{ 
    std::string raw_ip="127.0.0.1"; 
    int port=3333; 
    try 
    { 
    asio::ip::tcp::endpoint ep(asio::ip::address_v4::any(),port); 
    asio::io_service ios; 
    asio::ip::tcp::acceptor acceptor(ios, ep); 
    acceptor.listen(); 
    asio::ip::tcp::socket sock(ios); 
    acceptor.accept(sock); 
    asio::streambuf request; 
    asio::read_until(sock, request, "\n"); 
    std::istream request_stream(&request); 
    std::cout << request_stream.rdbuf() << std::endl; 

    asio::streambuf response; 
    std::ostream response_stream(&response); 
    response_stream << "response from server\n"; 
    } 
    catch(system::system_error &e) 
    { 
    std::cout << e.what() << std::endl; 
    return -1; 
    } 
    return 0; 
} 

auch ich die beste Art und Weise frage mich, eine große Menge von Daten zu/von Steckdose zu übertragen, wie Socket wir sagen, dass ich bin fertig Schreiben von Daten an die Steckdose? Und woher wissen wir, dass wir das letzte Datenbyte vom Sockel gelesen haben? Vielen Dank.

+0

Senden Sie auch einige Metadaten - sagen Sie der anderen Seite, wie viele Daten zu erwarten sind. –

Antwort

1

Sie müssen die Blockierfunktion 'ios.run() in both the client and server to animate boost :: io_service` aufrufen. Auf jeden Fall glaube ich nicht, dass deine App irgendetwas nutzbares produzieren wird. Sie sollten versuchen, eines der Asio-Beispiele als Ausgangspunkt zu verwenden.

Das TCP-blockierende Echo-Client/Server-Beispiel sollte ein guter Ausgangspunkt für das sein, was Sie tun möchten.

http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_client.cpp

http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/example/cpp11/echo/blocking_tcp_echo_server.cpp

Auf einer TCP-Verbindung, können Sie einen einzelnen Asio Puffer verwenden alle Daten, um sicherzustellen, wird gesendet. Sie sollten jedoch vorher eine Nachricht an den Client senden, damit dieser weiß, wie viele Daten er erhalten soll.

+0

Danke, die tcp echo Beispiele gibt wirklich viele Einblicke. Ich erkenne, dass es mehrere Möglichkeiten gibt, der anderen Seite zu sagen, dass ich fertig bin, Daten in den Socket zu schreiben, 1, eine tcp-Nachricht zu senden (nicht sicher, wie das in Asio zu machen ist) Socket 3 definiert einen Regel-BTW-Client und -Server. – Blake

+0

Die Beispiele senden TCP-Nachrichten hin und her. –

Verwandte Themen