关于IOCP(完成端口):在运用postqueuedcompletionstatus函数退出完成端口之前需要关闭套接字吗
关于IOCP(完成端口):在使用postqueuedcompletionstatus函数退出完成端口之前需要关闭套接字吗?
RT,在服务器端需要先进行closesocket的操作,然后再去post吗?我在网上参考了一些代码,是利用事件通知和Post函数相结合,来确保创建的工作线程完全退出。但是若在使用post函数之前先进行closesocket操作的话,再执行到等待事件完成的函数WaitForMultipleObjects时,就会一直处于阻塞等待状态。而将post函数之前的closesocket操作取消的话,就不会出现上述问题而是顺利退出。请问上述问题怎么解释,小弟初来乍到,求高人指点,谢谢!
------解决方案--------------------
这个只有在问题现场才能知道是怎么回事,以我的经验,很可能是你在使用多线程的时候没有做同步,多个线程同时用一个 SOCKET 发送,或者你在一个 SOCKET 上 Post Recv 了多次,造成 Recv 乱序,
仅作参考,
------解决方案--------------------
同意。
重复投递recv是危险的行为,乱序都是小事了(通告本来就是LIFO),更难受的是接收错位。
因为每一次投递,不一定非等接收完毕才返回。
如果你对这种错位进行后期调整,工作将是巨大的。当然也不建议这么做。
特别是当网络环境不好的情况下,这种错位调整简直是灾难。
iocp的发送却不同,非常建议使用重复投递。
RT,在服务器端需要先进行closesocket的操作,然后再去post吗?我在网上参考了一些代码,是利用事件通知和Post函数相结合,来确保创建的工作线程完全退出。但是若在使用post函数之前先进行closesocket操作的话,再执行到等待事件完成的函数WaitForMultipleObjects时,就会一直处于阻塞等待状态。而将post函数之前的closesocket操作取消的话,就不会出现上述问题而是顺利退出。请问上述问题怎么解释,小弟初来乍到,求高人指点,谢谢!
IOCP
完成端口
服务器
退出
事件
------解决方案--------------------
这个只有在问题现场才能知道是怎么回事,以我的经验,很可能是你在使用多线程的时候没有做同步,多个线程同时用一个 SOCKET 发送,或者你在一个 SOCKET 上 Post Recv 了多次,造成 Recv 乱序,
仅作参考,
------解决方案--------------------
同意。
重复投递recv是危险的行为,乱序都是小事了(通告本来就是LIFO),更难受的是接收错位。
因为每一次投递,不一定非等接收完毕才返回。
如果你对这种错位进行后期调整,工作将是巨大的。当然也不建议这么做。
特别是当网络环境不好的情况下,这种错位调整简直是灾难。
iocp的发送却不同,非常建议使用重复投递。