Boost logo

Boost Users :

Subject: Re: [Boost-users] asio ip::tcp::socket::read(), always returns end of file
From: Lloyd (lloydkl.tech_at_[hidden])
Date: 2011-06-06 06:32:46


This code reproduces the problem. I am not able to find why exception
is thrown. I have removed error checking to make the code to read
easier.

Thanks,
  Lloyd

class Connection:public boost::enable_shared_from_this<Connection>
{
public:
        Connection(boost::asio::io_service& ios):sock(ios)
        {
        }
        void Connect()
        {
                sock.connect(boost::asio::ip::tcp::endpoint(boost::asio::ip::address_v4::from_string("172.16.29.12"),13));
                boost::asio::write(sock,boost::asio::buffer("RUN 1\r\n",7));
                try
                {
                        boost::asio::streambuf b;
                        boost::asio::read(sock,b);
                }
                catch(exception& e)
                {
                        cout<<e.what()<<endl; //"This exception is thrown always-> "End of file"
                }
        }
private:
        boost::asio::ip::tcp::socket sock;

};

class MainClass
{
public:
        void Connect()
        {
                boost::thread_group tg;
                tg.create_thread(boost::bind(&MainClass::Thread,this));
                tg.join_all();
        }
        
        void Thread()
        {
                boost::asio::io_service ios;
                boost::shared_ptr<Connection> asc=boost::shared_ptr<Connection>(new
Connection(ios));
                asc->Connect();
                ios.run();
        }
};

int main()
{
        MainClass mc;
        mc.Connect();
        return 0;
}

On Mon, Jun 6, 2011 at 2:31 PM, Lloyd <lloydkl.tech_at_[hidden]> wrote:
> Thanks Martin. The server sends back the data, I have checked it with
> wireshark. I am able to sniff and see the data.
>
> This program is not using any complex protocol, it is simple "tcp"
> based text protocol. first of all am not able to read anything from
> the server.
>
> One more thing I would like to add is the async_connect() is called
> from a thread, the io_service is also inside the thread. there are
> multiple treads like this. But I have tried removing the thread, that
> too does not mak any difference. I have also tried blocking
> connect(),write(), and read(), now also the read fails!
>
> If this post is not clear, I am ready to post my code...
>
> Thanks
>  Lloyd
>
> On Mon, Jun 6, 2011 at 2:21 PM, Martin Dyring-Andersen
> <mda_at_[hidden]> wrote:
>> Hi Lloyd,
>>
>>> I have an asio::ip::tcp::socket.  Whenever I try to read from it, it
>>> throws an exception "end of file". But it is possible to write to the
>>> socket at any time! This is a client side application, it connects to
>>> the server using asio::async_connect(). The server is sending back the
>>> data, I checked it with wireshark. I tried using the both async_read()
>>> and read(), in both cases it fails with the same error. But both
>>> async_write(), and write() works perfectly. What could be the reason?
>>
>> You don't provide a lot of information about the protocol, but the behavior you are seeing might be the server shutting down the servers' sending side of the connection, like
>>
>> sock.shutdown(boost::asio::ip::tcp::socket::shutdown_send, error);
>>
>> which still will leave the client able to write() data to the socket. The client should be able to read the data sent from the server before the shutdown() though.
>>
>> Just an idea.
>>
>> Best regards,
>> Martin Dyring-Andersen
>> _______________________________________________
>> Boost-users mailing list
>> Boost-users_at_[hidden]
>> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>>
>


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net