2012-06-14 90 views
0

我试图让使用升压异步UDP客户端:: ASIO 我得到互联网上的一些代码,我设法发送消息的异步UDP客户端。 但我的客户端没有收到来自服务器的消息(并且它在我不使用增强功能时起作用)。使得使用boost :: ASIO

这里是我的代码

class udp_async_client 
{ 
public: 

    udp_async_client (boost::asio::io_service& io_service, std::string& host, std:: string port, char **av , int ac) 
: reply() 
, _io_service (io_service) 
, _sock (io_service, udp:: endpoint (udp:: v4(), 0)) { 

udp:: resolver resolver (_io_service); 
udp:: resolver:: query query (udp:: v4(), host, port); 
udp:: resolver:: iterator endpoint_iterator = resolver.resolve (query); 
sender_endpoint = *endpoint_iterator; 

_io_service.run(); 

//test request string                                                      
using namespace std; 


std::string request = av[3]; 
for (int i = 4 ; i < ac ; ++i) 
    { 
    request += ";"; 
    request += av[i]; 
    } 

std:: cout <<"Request is:" <<request <<std:: endl; 



_sock.async_send_to (boost:: asio:: buffer (request.c_str(), request.length()) 
        , sender_endpoint 
        , boost:: bind (&udp_async_client::handle_send_to_server 
            , this, boost:: asio:: placeholders:: error 
            , endpoint_iterator)); 

    } 

~udp_async_client() { 
_io_service.stop(); 
    } 

    void handle_receive_from (const boost::system::error_code& error, 
         size_t bytes_recvd) {} 

    void handle_receive_from (const boost::system::error_code& error, 
         size_t bytes_recvd) {} 

    void handle_send_to_server (const boost::system::error_code& e, 
          udp:: resolver:: iterator endpoint_iterator) { 
std:: cout <<"Handle send to" <<std:: endl; 
char reply [max_length] = {}; 
_sock.async_receive_from (
          boost:: asio:: buffer (reply, max_length), sender_endpoint, 
          boost:: bind (&udp_async_client::handle_receive_from, this, 
             boost:: asio:: placeholders:: error, 
             boost::asio::placeholders::bytes_transferred)); 

std:: cout <<"Reply is:" <<reply <<std:: endl; 
    } 

private: 
char reply [max_length]; 
boost::asio::io_service& _io_service; 
udp:: socket _sock; 
boost:: asio:: ip:: udp:: endpoint sender_endpoint; 

}; 

和我的主:

int main (int ac, char** av) { 

    if (ac < 5) { 
    std:: cerr <<"Usage: nonblocking_udp_echo_client <host> <port> <name> <name to reach> \n"; 
return 1; 
} 

    boost:: asio:: io_service io_service; 
    std:: string host (av[1]); 
    std:: string port (av[2]); 

    while (true) 
    { 
    udp_async_client cli (io_service, host, port, av , ac); 
    boost:: this_thread:: sleep (boost:: posix_time:: millisec (500)); 
    } 
return 0; 
    } 

我不知道我做错了什么......

+0

因为你有两个'handle_receive_from'函数,所以我很惊讶编译。更大的问题是,在'handle_send_to_server'中的回复中使用了局部变量作为缓冲区,'handle_send_to_server'返回后缓冲区不再有效。 –

+1

有一个工作的异步UDP示例[here](http://www.boost.org/doc/libs/1_49_0/doc/html/booster_asio/tutorial/tutdaytime6.html)。 – Default

+0

我从来没有传入handle_send_to_server。唯一显示的是“请求是[0123]” – kavaliero

回答

3

_io_service.run()是一个阻塞调用。您的代码实际上不会传递该行,直到在io_service上调用停止。

+0

但我发送请求和我的服务器得到我发送的内容... – kavaliero

+0

每当你停止io_service,只发送一条消息。 – Mohammad

+0

我如何使用异步io_service? – kavaliero

相关问题