我很新的boost :: asio,我遇到了一个问题,我真的不知道如何解决,请问您可以请帮我。boost :: asio read - 返回所有数据从套接字读取,而不等待EOF
一般来说,我试图实现基于boost :: asio的代理服务器。我使用async_read_some功能从服务器读取响应,这样的事情:
_ssocket.async_read_some(boost::asio::buffer(_sbuffer),
boost::bind(&connection::handle_server_read_body_some,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));
一切都很好,它读取一些数据串和呼叫处理程序。问题在于当我调用async_read_some函数时 - 并且没有更多数据要从套接字读取。所以处理程序不需要大约15秒 - 直到EOF将被驱散。 (所以服务器套接字断开)。我已经尝试了不同的读取函数,并且它们都只在1或mote字节读取或出现错误时才返回。
事情是,有时我不知道我需要读多少字节 - 所以我只需要阅读所有内容。我试图用
boost::asio::socket_base::bytes_readable
或
_ssocket.available(err)
要figgure了多少字节的插座avaliable,但问题是,这些函数会返回一个可以无阻塞地读取的字节数,这样我就可以不要以我的实现为基础,即使是从测试中看到,有时,bytes_readable返回0,然后在同一个套接字上调用async_read_some,读取大量数据。
我的问题是有没有什么办法来获得亚胺化返回(在同步调用的情况下)/处理程序调用(在异步的情况下),当没有更多的数据从套接字读取?因为目前它只持续15秒直到EOF。
我会appriciate任何意见或提示,你可以给我。
我认为你面对的TCP/IP,这里的基本面。除了远程套接字告诉它(即EOF)时,套接字如何知道什么时候没有更多的数据要读取? – Nick
使用流式套接字(如TCP)不可能知道,因为它是流式传输。像TCP连接这样的网络流就像现实生活中的一个流,数据从一端流向另一端,而结束流的唯一方法是切断连接。如果你想要消息边界,那么要么将它们添加到你的协议中(要么使用包含消息边界的协议),要么使用UDP。 –
嗯......但你认为需要10-15秒才能说出来吗?我的意思是,是的,我同意你的观点,并期望远程套接字在没有更多数据存在的情况下可以通知,但是这个延迟有点太长,你不这么认为吗? – miks131