none
异步TCP的服务端,开启一段时间后异常 RRS feed

  • 问题

  • 主要用于
    连接设备 接受数据入库和缓存

    现在情况是
    刚开启没问题
    服务端,软件模拟连接OK
    客户端,软件模拟OK
    设备,接入正常
    可一段时间后,大致情况是:
    1.内外网可以连接到开启的端口
    2.软件模拟可以发送,但接受不到数据
    (一般 3个多小时 可以连接端口 但数据没上来 主要在外网端体现 内网测试还是正常)
    (是不是 我服务器IIS等的设置没配好Windows server 2012 IIS8)

    麻烦有人看下
    下面是代码:

    private static Socket listener = null;
    
    /// <summary>
    /// 开始监听
    /// </summary>
    /// <param name="port">端口号</param>
    public void StartListening(int port)
    {
        // 建立服务器Socket
        // 获取本机DNS
        // 开始监听
        // IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
        IPAddress ipAddress = IPAddress.Any;//.Parse("192.168.1.104");
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port);
        // 创建 TCP/IP Socket.
        listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);
        // Socket绑定到本地终结点,然后侦听传入的连接。
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(100);
            while (true)
            {
                // 设置无信号状态的事件
                allDone.Reset();
                        
                //线程池
                ThreadPool.QueueUserWorkItem(o => { ThreadAsync(); });
                        
                //开启线程
                //Thread thread = new Thread(ThreadAsync);
                //thread.Start();
    
                // 在继续之前,等待连接
                allDone.WaitOne();
            }
        }
        catch (SocketException e)
        {
            FileConfig.WritetFile(Constants.AsyncSocketException, e.Message, e.ErrorCode);
        }
    }
    /// <summary>
    /// 线程异步
    /// </summary>
    private void ThreadAsync()
    {
        // 开始异步Socket侦听连接。
        listener.BeginAccept(
            new AsyncCallback(AcceptCallback),
            listener);
    }
    /// <summary>
    /// 异步回调
    /// </summary>
    /// <param name="ar"></param>
    public static void AcceptCallback(IAsyncResult ar)
    {
        // 信号 主线继续。
        allDone.Set();
        // 获取Socket处理客户端请求。
        // Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);
    
        // 加入列表 MyHashTable.socketList
        MyHashTable.AddListItem(MyHashTable.socketList, handler.RemoteEndPoint.ToString(), handler);
    
        // 赋值线程名字
        Thread.CurrentThread.Name = handler.RemoteEndPoint.ToString();
        while (true)
        {
            // 休眠一秒 避免循环占用过多CPU
            Thread.Sleep(1000);
            if (handler.Available > 0)
            {
                // 创建状态对象。
                StateObject state = new StateObject();
                state.workSocket = handler;
                handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback), state);
            }
        }
    }
    /// <summary>
    /// 读取
    /// </summary>
    /// <param name="ar"></param>
    public static void ReadCallback(IAsyncResult ar)
    {
        String content = String.Empty;
    
        // 索和处理程序套接字的状态对象
        // 异步状态对象。
        StateObject state = (StateObject)ar.AsyncState;
        Socket handler = state.workSocket;
    
        // 从客户端套接字读取数据。
        int bytesRead = handler.EndReceive(ar);
    
        string strSql = string.Empty;
        string warningCode = string.Empty;
        if (bytesRead > 0)
        {
            content = Encoding.ASCII.GetString(state.buffer, 0, bytesRead).ToLower();
            //一系列判断 入库操作 有问题的话 我也可以把这块 贴出来
            ...
        }
    
        //置空 IAsyncResult 对象
        ar = null;
    }

    页面代码开启监听

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //异步Socket监听
            AsyncSocket asyncSocket = new AsyncSocket();
            asyncSocket.StartListening(2020);           
        }
    }

    2013年7月11日 8:58

全部回复

  • Hi,

      欢迎来到MSDN中文论坛。

      你是不是组策略有设置了IPSec或者一些端口显示,或者你的客户端存在防火墙的端口限制,如果那样的话你先用telnet去连接下服务器端,以及通过服务端链接客户端看下数据能够到达,可以使用IP Tools工具去模拟下发送数据和接受数据,具体的下载地址如下:http://down.tech.sina.com.cn/content/15352.html


    Jason Wang [MSFT]
    MSDN Community Support | Feedback to us

    2013年7月12日 3:55
    版主
  • 能够连接 服务器 端口

    我也有第三方的软件可以测试的

    但就是数据不知道什么情况 上不来

    我今天又把线程名 赋值的注释掉

    还在测试 

    只是不知道 这个理清楚的规则

    错也错的很难受

    2013年7月12日 4:26