2012-02-03 25 views

回答

3

像西蒙说的,你不能这样做boost::asio::read()(或boost::asio::async_read())。但是,对于read(),您可以在套接字上调用native_handle()以获取套接字描述符,然后使用::recvmsg()MSG_PEEK标志。同样,您可以拨打async_read()null_buffers()作为接收缓冲区,然后使用native_handle()/::recvmsg()技巧查看数据。查看关于如何使用null_buffers()的boost文档的this section

+0

再想一想我会做任何事情来防止使用偷看。我只需要查看连接套接字的第一个字节,因为它被2种不同的协议解释为不同的协议(用作标记来考虑它是协议A还是协议B),但是从http读取平台实现的具体描述://support.microsoft.com/kb/192599我意识到,即使我只需要1个字节,情况可能相当不便。 – Ghita 2012-02-04 05:39:39

+0

使用其中一种peek方法(使用recv/WSARecv(...,MSG_PEEK)或ioctlsocket(FIONREAD,...))来获取接收缓冲区中的数据量的Winsock应用程序效率非常低,因为系统必须锁定数据并对其进行计数。当系统执行此操作时,实时网络很可能仍会尝试用更多数据填充缓冲区。偷看也不会删除数据,这将允许缓冲区达到其存储限制。因此,这会关闭网络数据流量并使整个数据传输过程效率低下。 – Ghita 2012-02-04 05:40:11

1

不,这是不可能的 - 如果你想要一种peek你必须存储由你自己偷看的字节。

+0

是的,即使在我的具体情况下,这也是推荐的方法 – Ghita 2012-02-04 05:42:26