|
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