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

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条回答 默认 最新

  • houwhf 2015-09-29 07:15
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 有卷积神经网络识别害虫的项目吗
  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件