发布
社区首页 >问答首页 >客户端无法在客户端接收带有socket.async_receive的数据异常

客户端无法在客户端接收带有socket.async_receive的数据异常
EN

Stack Overflow用户
提问于 2013-03-22 08:15:29
回答 1查看 2.6K关注 0票数 0

我有一个简单版本的客户端使用boost asio。一旦客户端发送数据,它就会收到来自服务器的响应。这是客户端的代码

代码语言:javascript
代码运行次数:0
复制
void RunClient()
    {
        try
        {
            boost::asio::io_service io_service;
            boost::asio::ip::tcp::resolver resolver(io_service);
            boost::asio::ip::tcp::resolver::query query( "127.0.0.1", boost::lexical_cast< std::string >( 7777 )); //9100
            boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
            boost::asio::ip::tcp::socket socket(io_service);
            socket.async_receive(boost::asio::buffer(buf_client, 3000), 0, ClientReceiveEvent);

            boost::asio::connect(socket, endpoint_iterator);

            boost::system::error_code ignored_error;
            std::cout << "Sending message \n";
            boost::asio::write(socket, boost::asio::buffer("Data to send"), ignored_error);
            io_service.run();
        }
        catch (std::exception & ex)
        {
            std::cout << "[" << boost::this_thread::get_id()<< "] Exception: " << ex.what() << std::endl;   
        }
    }

这是我的ClientReceiveEvent

代码语言:javascript
代码运行次数:0
复制
void ClientReceiveEvent(const boost::system::error_code& error, std::size_t bytes_transferred)
    {
        if(!error)
        {
            std::cout << "Message: " << buf_client.data() << std::endl;

        }
        else
        {
            std::cout << "Error occurred." << error.message() << std::endl;
        }
    }

对于输入数据,我从上面的方法中得到一个错误。

代码语言:javascript
代码运行次数:0
复制
Error occurred.The file handle supplied is not valid

我在客户身上做错什么有什么建议吗?

更新:

我让代码起作用了,但是我不明白为什么这个声明

代码语言:javascript
代码运行次数:0
复制
socket->async_receive(boost::asio::buffer(buf_client, 3000), 0, ClientReceiveEvent);

需要在连接后放置。以及为什么声明

代码语言:javascript
代码运行次数:0
复制
io_service->run();

需要放在最后。我以为这会启动异步进程。

我还想知道如何将数据重新发送到服务器。我能成功地发送一次。如何重新发送命令?

工作守则是:

代码语言:javascript
代码运行次数:0
复制
boost::shared_ptr< boost::asio::io_service > io_service(new boost::asio::io_service);
            boost::shared_ptr< boost::asio::ip::tcp::socket > socket(   new boost::asio::ip::tcp::socket( *io_service ) );
            boost::asio::ip::tcp::resolver resolver(*io_service);
            boost::asio::ip::tcp::resolver::query query( "127.0.0.1", boost::lexical_cast< std::string >( 7777 )); //9100
            boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
            socket->connect(endpoint_iterator->endpoint());
            socket->async_receive(boost::asio::buffer(buf_client, 3000), 0, ClientReceiveEvent);
            boost::system::error_code ignored_error;
            std::cout << "Sending message \n";
            boost::asio::write(*socket, boost::asio::buffer("some data"), ignored_error);           
            io_service->run();
EN

回答 1

Stack Overflow用户

发布于 2013-03-22 09:44:28

虽然async_receive计划在代码调用run()之后执行读操作,但在调用async_receive函数本身时,它仍然需要一个连接的套接字。这是因为在内部,async_receive的实现如下:

代码语言:javascript
代码运行次数:0
复制
this->get_service().async_receive(this->get_implementation(),buffers, 0, BOOST_ASIO_MOVE_CAST(ReadHandler)(handler));

this->get_implementation()表达式返回内部套接字句柄的副本,在您的情况下没有连接。

换句话说,异步读取计划完成后,它将无助于连接套接字,因为读取将被安排在未连接的套接字上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15565633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档