我使用boost :: asio :: read(或可能等价于async_read)从套接字读取一些数据。boost :: asio - 窥探到套接字缓冲区
是否有可能将字节读取到底层套接字中,以便下一次在套接字上读取数据时再次接收该数据?
我使用boost :: asio :: read(或可能等价于async_read)从套接字读取一些数据。boost :: asio - 窥探到套接字缓冲区
是否有可能将字节读取到底层套接字中,以便下一次在套接字上读取数据时再次接收该数据?
像西蒙说的,你不能这样做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。
再想一想我会做任何事情来防止使用偷看。我只需要查看连接套接字的第一个字节,因为它被2种不同的协议解释为不同的协议(用作标记来考虑它是协议A还是协议B),但是从http读取平台实现的具体描述://support.microsoft.com/kb/192599我意识到,即使我只需要1个字节,情况可能相当不便。 – Ghita 2012-02-04 05:39:39
使用其中一种peek方法(使用recv/WSARecv(...,MSG_PEEK)或ioctlsocket(FIONREAD,...))来获取接收缓冲区中的数据量的Winsock应用程序效率非常低,因为系统必须锁定数据并对其进行计数。当系统执行此操作时,实时网络很可能仍会尝试用更多数据填充缓冲区。偷看也不会删除数据,这将允许缓冲区达到其存储限制。因此,这会关闭网络数据流量并使整个数据传输过程效率低下。 – Ghita 2012-02-04 05:40:11