Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将数据与windows中的套接字关联以在recv/WSARecv hook中使用的最佳方法_C++_Sockets_Networking_Hook - Fatal编程技术网

C++ 将数据与windows中的套接字关联以在recv/WSARecv hook中使用的最佳方法

C++ 将数据与windows中的套接字关联以在recv/WSARecv hook中使用的最佳方法,c++,sockets,networking,hook,C++,Sockets,Networking,Hook,我正在编写用于钩住WSARecv/recv和其他网络功能的dll,我需要使用用户连接(套接字)来协调一些数据,并在WSARecv/recv/WSASend/send钩子中使用它。 我想知道,做这件事的最佳和最快的方法是什么 我现在这样做的方式非常简单:我有一个套接字数组(比如),第二个数组有相同的索引(aka fd),我用我的信息存储结构 这种方法的问题很明显——每次我必须钩住传入或传出的数据包时,我必须循环我的fd_数组,通过套接字找到fd(索引),然后使用它访问第二个数组中的数据。当我的服务

我正在编写用于钩住WSARecv/recv和其他网络功能的dll,我需要使用用户连接(套接字)来协调一些数据,并在WSARecv/recv/WSASend/send钩子中使用它。 我想知道,做这件事的最佳和最快的方法是什么

我现在这样做的方式非常简单:我有一个套接字数组(比如),第二个数组有相同的索引(aka fd),我用我的信息存储结构

这种方法的问题很明显——每次我必须钩住传入或传出的数据包时,我必须循环我的fd_数组,通过套接字找到fd(索引),然后使用它访问第二个数组中的数据。当我的服务器有超过1000个连接时,这会带来麻烦(每次服务器发送或接收数据包时,我必须循环一个包含1000个元素的数组来查找fd)


有没有更好更快的方法

要更改套接字调用,不建议使用挂接API调用的方法。您可以使用winsockLSP或WFP方法来过滤网络操作。这两种机制都提供了存储每个网络连接附加信息的框架。

使用由
套接字
句柄索引的
std::map
。关闭
SOCKET
时,不要忘记删除条目,因为
SOCKET
可能会在将来的连接中重新使用。使用哈希表或保持列表排序(映射、设置等)。