问题描述
- C#用Socket异步时出现错误
-
各位大侠:
我刚用 C# 写Socket 代码,服务器端用异步监控客户端,代码如下
//开启服务器端监控---Begin
internal void MonitorClient()
{
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 端口号);
Socket serverSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try
{
serverSocket.Bind(ipep);
serverSocket.Listen(100);
serverSocket.BeginAccept(clientAcceptCallBack, serverSocket);
}
catch ( }
finally { } //serverSocket.Close(); serverSocket.Dispose();
}//End//异步监听客户端连接---Begin private void clientAcceptCallBack(IAsyncResult ar) { string IP = ""; try { Socket serverSocket = ar.AsyncState as Socket; Socket clientSocket = serverSocket.EndAccept(ar); //结束异步Accept并获已连接的Socket IPEndPoint ipEndPoint = (IPEndPoint)clientSocket.RemoteEndPoint; //可能在这里或上面两行出错 IP = ipEndPoint.Address.ToString() + ":" + ipEndPoint.Port.ToString(); ThreadPool.QueueUserWorkItem(new WaitCallback(acceptClientMsg), (object)IP); //收信息,并根据收到的信息执行相关操作 serverSocket.BeginAccept(clientAcceptCallBack, serverSocket); //继续异步Accept,保持Accept一直开启! } catch (Exception ex) { } finally { } }//End 在 clientAcceptCallBack 中偶尔会出现“远程主机关闭了一个现有连接”的错误,但出现次数少,没办法跟踪。 由于出现次数少,没有规律,目前还不知道具体是什么原因,没办法跟踪和解决。 有没有哪位高手知道是什么原因,或碰到过?
解决方案
acceptClientMsg 里是如何处理的?接收到消息后是否有返回信息?
如果有的话,应该是服务器端处理时间常,客户端ACCEPT超时,自动断开连接了。然后服务器端处理完毕后发送信息的时候就会出现已经关闭的错误。
不知道是不是这个问题,可以在ThreadPool.QueueUserWorkItem(new WaitCallback(acceptClientMsg), (object)IP); 之前加SLEEP,看看是否会固定出现关闭的错误。
解决方案二:
acceptClientMsg 专门负责处理消息,根据消息的类型执行各种操作,有些会返回信息给客户端,有些不会。我原来用 .exe 运行,当时发现:一般在客户端连接或断开的时候经常会出现这种情况。遗憾的是我用代码运行服务器后就没有出现这种情况。
谢谢 houwhf,我先按你说的改下程序。
时间: 2024-08-01 19:49:58