日期:2014-05-17  浏览次数:21394 次

TCP服务器编程CPU占有率过高问题
有几个问题需要咨询下各位大侠,采用的是tcplistener和tcpclient类客户端和服务端都在自己电脑上,客户端为网上下载测试工具。
1:当服务器端和客户端在通信的时候,CPU占用基本为0,但是当客户端断开连接的时候,CPU占用率一下达到25%,如果再断开,再连接CPU占用率还会上升。
2:当同一Ip第一次连接的时候,异步接收BeginAcceptTcpClient能执行,断开第二次再连接就不能执行,此时其它IP连接能执行。
 MyTcpListenerInfo.MyTcpListener[Index].BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClient), MyTcpListenerInfo.MyTcpListener[Index]);
  对这个问题我是采用在DoAcceptTcpClient函数及其调用函数中使用了循环
 for (int i = 0; i < MyTcpListenerInfo.MyTcpListener.Count; i++)
                {
                    if (MyTcpListenerInfo.MyTcpListener[i].Pending())
                    {


                        MyTcpListenerInfo.MyTcpListener[i].BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClient), MyTcpListenerInfo.MyTcpListener[i]);


                    }

                }
来判断是否有新的连接接入,如果有则开始异步接收。这样做是否合理,还有这个异步模式是否包含IOCP。

3:对于高性能的TCP服务器,是否最好使用SocketAsyncEventArgs?

请各位大侠指点下,非常感谢!

------解决方案--------------------
使用SocketAsyncEventArgs是可以的,但在服务器只能用于接受与接收,不可用于发送,因为SocketAsyncEventArgs的状态只能是接受、接收、发送的状态之一,如果正在接收,你这时发送的话就会导致状态无效的异常,而接收总是在接受之前不存在这个问题,不过也有一个例外,那就是客户端连接已建立,但未发送数据到服务器端,这时服务器断开客户端连接也会发生状态无效的异常,所以需要处理好这个异常。
通常一个SocketAsyncEventArgs实例是可以重复使用,以提高服务器性能,若没有处理好这个异常则会导致这个实例再也无法使用。