2017-07-02 57 views
1

我實現了兩個簡單的客戶端和服務器示例,但它不起作用。客戶端和服務器都凍結而沒有任何消息打印。如何使用boost.asio來交換數據來回btw客戶端和服務器?

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; 
} 

我也想知道,以大量的數據從插座傳送到/最好的辦法,我們如何告訴插口,我我正在寫數據到套接字?我們如何知道我們已經從套接字讀取了最後一個字節的數據?謝謝。

+0

發送一些元數據 - 也就是告訴另一方需要多少數據。 –

回答

1

您需要調用阻塞函數'ios.run()in both the client and server to animate boost :: io_service`。無論如何,我認爲你的應用不會產生任何可用的東西。你應該嘗試使用其中一個例子作爲起點。

TCP阻塞回聲客戶機/服務器的例子應該是你想要做的一個很好的起點。

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

在一個TCP連接時,您可以使用一個ASIO緩衝,以確保所有數據的發送。但是您應該事先向客戶發送一條消息,以便知道應該接收多少數據。

+0

謝謝,tcp echo的例子真的給了很多見解。我意識到有幾種方法可以告訴對方我已經完成了將數據寫入套接字的工作,1,發送一個tcp消息(不知道如何在asio中執行該操作,我想這就是我所要求的)2,關閉套接字3定義一個規則btw客戶端和服務器。 – Blake

+0

示例來回發送TCP消息。 –

相關問題