若风如烟 2023-01-18 14:15 采纳率: 0%
浏览 55
已结题

IOCP处理好的包是否能重新投递给IOCP进行后续操作

我正在visual studio上做一个同时读取多个目录下的文件并将文件通过SOCKET的send发送的模块,其中读取文件部分用了IOCP进行异步读取文件,当有包读取完成时会由工作线程负责发送操作。发送数据时采用了令牌桶限速,令牌不够的时候需要将当前处理的包重新放入IOCP中。请问将当前处理的包重新放入IOCP中这个操作是否可行,如果可行,该如何操作,并且必须保证包的顺序不能改变。

  • 写回答

1条回答 默认 最新

  • 「已注销」 2023-01-18 15:13
    关注

    当有数据包读取完成并由工作线程负责发送时,如果需要通过重新投递给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
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月12日
  • 创建了问题 1月18日