关于IO完成端口,尚有疑惑的地方,特请教各位。欢迎参与讨论。
首先,下述的讨论假定IO操作已经与完成端口绑定在一此,且所进行的正常的IO操作可以通知该IO完成端口。1、系统在一次I/O操作完成后将通知IO完成端口,后者可以通过GetQueuedCompletionStatus来取得。对此,我假设
进行了一次WSARecv的操作,而后我断开与客户机相联的网络,服务器何以得到与该客户相关的Socket?
换句话说,我的疑问是:
IO完成端口的状态队列(first-in-first-out)是下面哪种方式入队的:
当调用WSARecv(或其它)后,将该CompletionKey入队 还是
当该操作完成后,系统将与之相关的CompletionKey及状态入队,等待GetQueuedCompletionStatus来取?
又或是其它的情况?2、曾看过有篇文章讲,IO完成端口可能会在程序进行IO操作时分配“非分页核心内存”。严重时会导致系统的崩溃,与程序无关的其它进程或者某个驱动发生错误(我就遇到过这样的情况),尤其是在同时有较多的send或recv时。对此,我想问一下,导致这样的原因会是什么?与程序中发送数据时开的缓冲大小有没有关系?
3、为程序指定多大的发送、接收缓冲区较为合适?如果因为某些原因,底层的发送(或接收)缓冲(我指的是网络层afd.sys?)已满,那么程序中的发送(或接收)操作时所分配的缓冲(不是动态分配的)会被锁定(?我认为可能是),这样下去,必定导致系统配额不足而出错。4、个人在工作中遇到了难以索解的现象,疑与IO完成端口有关。现说一下我所见到情况,也请高手帮忙分析一下,谢谢!
程序在运行时,虚拟内存会突然激增(此时程序将出错),然后系统会报错:配额不足。此时无法运行其它程序,因为系统认为该程序不是一个合法的windows可执行程序,连记事本也不行。有时提示桌面非active...(记不清楚).有时候关机时,系统会出现提示:你没有权限...某个服务发生错误...等相类似的错误。个人对此的看法,是程序中有些地方处理不当,持续分配“非分页内存”,最终导致系统崩溃。只是会是什么原因造成的,至今没有找到答案。请各位就自己所知,发表自己的看法。谢谢。

解决方案 »

  1.   


    1、fifo是对 PER_IO_CONTEXT 而言的。
    2、没听说过。我做的每秒通讯27000次的服务器没出现这类问题。
    3、如果可以满足需要,通常缓冲区设置成8k字节比较好。
    4、看起来像是病毒发作,先杀杀毒吧。iocp请参考微软的iocp_standard例子,那是一个相当不错的例子。
      

  2.   

    1.是完成后
    在系统在wsarecv,wsasendto,writefile,readfile最终都要通过devioctrl来完成的,这个函数完成后会检查当前句柄是否与完成端口相联系(你可能猜到文件句柄的私有变量中有一个完成端口句柄),假如是的话就推到完成端口队列中。
      

  3.   

    to  wwwsq(wwwsq):
     iocp_standard 那有下载,能否提供!
      

  4.   

    MSDN自带就有,你在msdn里面查找“Writing Windows NT Server Applications in MFC Using I/O Completion Ports”
      

  5.   

    你是否采用了MFC的SOCKET类,我个人觉得,问题可能出现在这个地方。
      

  6.   

    to comman_wang:采用的不是socket类。
    to wwwsq:确实有病毒,但不知是否就是病毒引发的
    我再想想。谢谢各位!