qq_28378271
qq_28378271
采纳率0%
2015-09-29 06:53

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

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

            有没有哪位高手知道是什么原因,或碰到过?
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • qq_28378271 qq_28378271 6年前

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

    点赞 评论 复制链接分享
  • houwhf houwhf 6年前

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

    点赞 评论 复制链接分享

相关推荐