请教IOCP投递问题,此问题很是奇怪
RT 此问题很是奇怪的很。
看了很久IOCP的文章了。
但是对于投递操作,网络上似乎分为两大派系,
下面我分别说一下:
第一种投递方式:
是在IOCP线程池 外部直接调用WSASend或者WSARecive?而PostQueuedCompletionStatus只是被用来需要停止IOCP工作线程的时候调用一下(我自己,感觉这个函数是不是被用得鸡肋了?)
然后再在IOCP 工作线程里面通过
调用GetQueuedCompletionStatus 得到结果的状态通知。
第二种投递方式:
在IOCP工作线程外部只调用 PostQueuedCompletionStatus 来进行任何投递操作。
然后再调用 GetQueuedCompletionStatus 得到Post的投递,然后判断投递的类型,比如是Send数据,
那就调用WSASend来发送一下。。。
而发送的成功与否的结果通知还是通过GetQueuedCompletionStatus这个在下一次的时候得到?
那么,这两种方法,到底哪一种是正确的方法呢?肯定只有一种是正确的而且最合理额吧?
————问题分割线—————————————————————————————问题分割线————
还有 IOCP 比如 我要发送 一个2KB的数据,是不是只要在外部投递一次就好了?
这里的外部投递是指在IOCP工作线程之外,进行一个PostQueuedCompletionStatus 函数的调用。
然后在工作线程里面 是不是受到投递请求只要调用一次WSASend,一次性发送然后等待结果就行了?但是我缓冲区只设置了1kB。。。这个要怎么弄,自己处理发送两次吗?
————问题分割线—————————————————————————————问题分割线————
于此同时,我还发现另外一个问题。
很多人写IOCP都是一个个投递,这样是不是一种错误的做法?
IOCP的N次投递(重叠投递),一次处理,不就是IOCP的最大的好处吗,
如果不重叠了,IOCP就不能够将多个操作合并为一个,而这就会失去IOCP很大的IO并发处理的意义,是这样的吧?