我正在visual studio上做一个同时读取多个目录下的文件并将文件通过SOCKET的send发送的模块,其中读取文件部分用了IOCP进行异步读取文件,当有包读取完成时会由工作线程负责发送操作。发送数据时采用了令牌桶限速,令牌不够的时候需要将当前处理的包重新放入IOCP中。请问将当前处理的包重新放入IOCP中这个操作是否可行,如果可行,该如何操作,并且必须保证包的顺序不能改变。
当有数据包读取完成并由工作线程负责发送时,如果需要通过重新投递给IOCP进行后续操作,可以使用 PostQueuedCompletionStatus 函数来重新投递当前处理的数据包。
这个函数可以将一个状态值(通常是读取/发送的字节数)、一个指向用户数据的指针和一个句柄(通常是一个套接字)传递给IOCP。
在你的代码中,当令牌不够时,可以将当前处理的数据包重新放回IOCP队列中,这样等令牌足够时就可以继续处理这个数据包了。
BOOL bRet = PostQueuedCompletionStatus(
hIOCP, // I/O completion port handle
dwBytesTransferred, // Number of bytes transferred
(ULONG_PTR)pOverlapped, // Pointer to the overlapped structure
(LPOVERLAPPED_COMPLE