我一直试图在UDP数据包到达应用程序逻辑之前拦截它们。更确切地说,该应用程序使用DirectPlay服务器,没有源。 所以我发现DirectPlay通过发布多个WSARecvFrom来使用异步IO,然后让一些workerthreads等待WaitForSingleObject并最终使用WSAGetOverlappedResult检索IO状态。
当WSARecvFrom返回时,lpBuffers当然没有填充数据,因为该操作仍处于暂挂状态,将在稍后完成。
所以我的想法是获取数据是为每个WSARecvFrom调用在std :: map中保存lpOverlapped / lpBuffers对,然后,如果IO操作完成(在WSAGetOverlappedResult中),我会得到相应的(现在通过在地图中查找lpOverlapped来获得lpBuffers。
然而,似乎存在一个大问题:DirectPlay有时会使用相同的lpOverlapped地址多次调用WSARecvFrom,甚至使用相同的lpOverlapped-> hEvent或lpBuffers地址,也适用于同一个套接字(这些操作都不完整)在这个时候,所以他们都待定)。我无法理解为什么会发生这种情况,文档清楚地说:“如果多个I / O操作同时未完成,则每个操作都必须引用一个单独的WSAOVERLAPPED结构。” 因此我无法正确检索lpBuffers,因为当调用WSAGetOverlappedResult时,我不知道lpOverlapped对应哪个WSARecvFrom,因为有几个WSARecvFroms被调用,每个都有相同的lpOverlapped!怎么会这样?有谁知道DirectPlay如何处理这个?是否有另一种方式拦截(并最终丢弃)UDP数据包? (我不想使用司机)
(有一个很好的理由我尝试这样做:有人使用DirectPlay向游戏服务器发送被利用的UDP数据包,它“混淆”DirectPlay逻辑,基本上关闭了服务器。所以我必须过滤在特定的UDP数据包到达DirectPlay之前输出它们
任何暗示都很开心!
非常感谢!