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实例是可以重复使用,以提高服务器性能,若没有处理好这个异常则会导致这个实例再也无法使用。