iocp在发送或接送数据的时候可能会出现乱顺问题, 主要处理办法使用list来保证顺序:
发送:
1, 发送的时候, 先将数据组成成io entry,
再调用WSASend(...)发送数据,
如果数据发送不成功(pending), 则将该io entry加入io_send_queue(fifo队列)
2, 每次异步GetQueuedCompletionStatus中得到SEND_POST时, 表示有数据发送成功,
再从io_send_queue取出io entry, 经数据发送(发送成功的数据从queue中删除), 直到发送pending.
接收:
1, 调用WSARecv(..)为iocp投递buffer, 可以多线程投递, 不用管顺序, 一般来说先投递的buffer, 会先返回.
2, 异步GetQueuedCompletionStatus中得到RECV_POST时, 通过重疊io获取投递的buffer数据, 将buffer加入
io_recv_queue(fifo), 而后其他处理线程可以从io_recv_queue(fifo)逐一取出数据, 从io_recv_queue中取出的数据
可以保证是有序的
阅读(1828) | 评论(0) | 转发(0) |