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 中偶尔会出现“远程主机关闭了一个现有连接”的错误,但出现次数少,没办法跟踪。

            由于出现次数少,没有规律,目前还不知道具体是什么原因,没办法跟踪和解决。

            有没有哪位高手知道是什么原因,或碰到过?
c#

2个回答

acceptClientMsg 里是如何处理的?接收到消息后是否有返回信息?
如果有的话,应该是服务器端处理时间常,客户端ACCEPT超时,自动断开连接了。然后服务器端处理完毕后发送信息的时候就会出现已经关闭的错误。
不知道是不是这个问题,可以在ThreadPool.QueueUserWorkItem(new WaitCallback(acceptClientMsg), (object)IP); 之前加SLEEP,看看是否会固定出现关闭的错误。

acceptClientMsg 专门负责处理消息,根据消息的类型执行各种操作,有些会返回信息给客户端,有些不会。我原来用 .exe 运行,当时发现:一般在客户端连接或断开的时候经常会出现这种情况。遗憾的是我用代码运行服务器后就没有出现这种情况。
谢谢 houwhf,我先按你说的改下程序。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问