4个工作者线程,每一个连接5个并发收,两个IOCP对象。
    一个对象用于连接管理TCP Server,其中有两个辅助线程,一个用于重连(每十秒查询一次,如果没连接则进行连接,两个连续的连接之间有100ms延时),另一个用于实时对每个TCP Server进行通信,大约每一秒向一个TCP Server发送一次。
    另一个对象用于管理TCP Client,只是相应TCP Client的命令,如果接收到命令则进行返回。    现在遇到的问题是:启动程序后,连接(十多个连接)的时候CPU会上升到50%,有时CPU在连接成功后会降下来,有时将不下来,紧接着会出现各个TCP Server连续的连接和断开现象,收发也出现异常。大概是什么原因,请各位看官指教,谢谢!    会不会是第一个对象中有两个辅助线程,一个对连接后的Socket进行CreateIoCompletionPort,而另一个对其他连接上的Socket进行收发,导致IOCP部分产生冲突?

解决方案 »

  1.   

    基本上是哪部分的代码的问题,仔细看看自己的代码。
    或者,有个简单的方法,试试intel vtune(只能用在intel的cpu上,AMD也有自己的工具)。可以看到每句语句的执行占用cpu的时间。
    ==========广告签名============
    http://shop33712512.taobao.com
    淘宝店,专卖化妆品、自家蜂产品
    ==========广告签名============
      

  2.   

    设置socket连接等待超时应该就可以了。假如连接的对象不存在你的socket对象在等待
      

  3.   

    你连接的时候会不会出现这样的问题:
    一个socket发起connect请求,在还没有返回是否连接成功的时候,已经间隔了100ms,然后你又对该socket发起一次connect请求呢?
      

  4.   

    先设置非阻塞方式连接,然后设置连接超时(1s),返回后又设回阻塞方式。
        10s查询一次,每个连接之间的连接间隔是100ms,即当前的连接返回后Sleep(100),然后进行下一个连接(重新建立socket)。
        按说不会出现楼上两位所说的情况。    后来我跟踪了一下,发现部分连接上的Socket是在GetQueuedCompletionStatus时出现ERROR_NETNAME_DELETED而关闭的,有些是在WSARecv和WSASend时出现WSAENOTSOCK而关闭的。    我把上面的Sleep(100)改成Sleep(300)会改善很多,难道说连续的两个Connect之间须有足够的延时?
      

  5.   

    1 还不是完全明白你说的。2 感觉 “有些是在WSARecv和WSASend时出现WSAENOTSOCK而关闭的。”你这个错误,是不是你的socket已经失效了。3 你估计有同步吧,应该是同步没有做好。你这样的连接数量应该不是问题。
      

  6.   

    程序中,我在关闭Socket的地方设置了断点,在断开的时候,程序没有主动关闭,是在GetQueuedCompletionStatus时返回0,GetLastError时返回ERROR_NETNAME_DELETED而关闭的,好像是通信过程中导致了Socket关闭。    纳闷的是——什么原因导致了Socket的关闭?
      

  7.   

    后来经过调试发现,连接上的Socket都是在GetQueuedCompletionStatus时出现ERROR_NETNAME_DELETED而关闭的。
        
        什么原因导致了Socket的关闭???