SKKYJE 2020-12-10 12:35 采纳率: 25%
浏览 56
已采纳

新手求助C#TCP\IP如何让程序跳过当前连接不上的ip去连接下一个ip?

  public string LINE(string Eip)//查询线别方法
        {
            DataTable dt = new DataTable();
            string res = "";
            StringBuilder stringsql = new StringBuilder();
            stringsql.AppendFormat("SELECT DISTINCT E.Line FROM ESDkbnew AS E WITH(NOLOCK) INNER JOIN WO_INPUTINFO_NEW AS W WITH(NOLOCK) ON E.Line=W.LINE where ip='{0}' ", Eip);

            using (DBUtility.DABase objDB = new DBUtility.DABase(DBUtility.DBConnectionProvider.LasterTech))
            {

                res = objDB.ExecuteScalar(stringsql.ToString().Trim()).ToString();
            }

            return res;
        }
        public string WKTION(string Wip)//查询工站方法
        {
            DataTable dt = new DataTable();
            string Wes = "";
            StringBuilder stringsql = new StringBuilder();
            stringsql.AppendFormat("SELECT DISTINCT E.Workstation FROM ESDkbnew AS E WITH(NOLOCK) INNER JOIN WO_INPUTINFO_NEW AS W WITH(NOLOCK) ON E.Line = W.LINE where ip = '{0}' ", Wip);

            using (DBUtility.DABase objDB = new DBUtility.DABase(DBUtility.DBConnectionProvider.LasterTech))
            {
               
                    Wes = objDB.ExecuteScalar(stringsql.ToString().Trim()).ToString();
                
                    
            }

            return Wes;
        }

        public void GetESDKB()//循环读取服务端ip
        {
            DataTable dd = new DataTable();
            DataTable dt= new DataTable();
            StringBuilder strsql = new StringBuilder();

            dd.Columns.Add("ip", typeof(String));
            dd.Columns.Add("状态", typeof(String));
            dd.Columns.Add("工站", typeof(String));
            dd.Columns.Add("线别", typeof(String));

            strsql.AppendFormat("SELECT DISTINCT E.ip FROM ESDkbnew AS E WITH(NOLOCK) INNER JOIN WO_INPUTINFO_NEW AS W WITH(NOLOCK) ON E.Line = W.LINE where 1=1 AND ip IS NOT NULL ");//查询数据库ip列所有ip

            using (DBUtility.DABase objDB = new DBUtility.DABase(DBUtility.DBConnectionProvider.LasterTech))
            {            
                dt = objDB.GetDataTable(strsql.ToString().Trim());
            }    
              //使用tcp循环访问服务端ip
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    string strName = dt.Rows[i]["ip"].ToString();
                    DataRow dr = dd.NewRow();              
                    Socket clientScoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);                          
                    clientScoket.Connect(new IPEndPoint(IPAddress.Parse(strName.ToString()), 8080));
                
                if (clientScoket != null)
                {
                    byte[] data = new byte[10240];//创建缓存区接受数据
                    clientScoket.Send(Encoding.UTF8.GetBytes("1"));  //像服务端发送固定信息
                    int count = clientScoket.Receive(data); //将接受的数据存入缓存区
                    string str = Encoding.UTF8.GetString(data, 0, count);
                    if (str.Equals("0\n"))//根据服务端回传的状态显示断开或连接(0:断开 1:连接)
                    {
                        str = "断开";
                    }
                    else
                    {

                        str = "连接";
                    }
                    dr["ip"] = strName.ToString();
                    dr["状态"] = str;
                    dr["工站"] = WKTION(dr["ip"].ToString());
                    dr["线别"] = LINE(dr["ip"].ToString());

                    dd.Rows.Add(dr.ItemArray);
                    clientScoket.Close();
                }
                
                dataGridView1.DataSource = dd;
                EquipmentstatusColor(dataGridView1);
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
           
        }




        public void EquipmentstatusColor(DataGridView Equipmentgv)//根据状态改变颜色
        {
            if (Equipmentgv.Rows.Count > 0)
            {
                for (int i = 0; i < Equipmentgv.Rows.Count; i++)
                {
                    string zt = Equipmentgv.Rows[i].Cells[1].Value.ToString();
                    if (zt.Equals("断开"))
                    {
                        Equipmentgv.Rows[i].DefaultCellStyle.BackColor = Color.Red;
                    }
                }
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Gvdatastyle(dataGridView1);
            Thread mm = new Thread(GetESDKB);
            mm.IsBackground = true;
            mm.Start();
        }

如果服务端全部打开我的这个客户端程序运行没问题,如果有服务端处于关闭状态就会出现连接超时。现在想实现的效果就是当前ip不通的话就跳过当前IP循环下一ip这样就能实现只显示能连接成功的ip的效果了。

 

 

  • 写回答

12条回答 默认 最新

  • sinJack 2020-12-10 14:48
    关注
            public void GetESDKB()//循环读取服务端ip
            {
                DataTable dd = new DataTable();
                DataTable dt= new DataTable();
                StringBuilder strsql = new StringBuilder();
    
                dd.Columns.Add("ip", typeof(String));
                dd.Columns.Add("状态", typeof(String));
                dd.Columns.Add("工站", typeof(String));
                dd.Columns.Add("线别", typeof(String));
    
                strsql.AppendFormat("SELECT DISTINCT E.ip FROM ESDkbnew AS E WITH(NOLOCK) INNER JOIN WO_INPUTINFO_NEW AS W WITH(NOLOCK) ON E.Line = W.LINE where 1=1 AND ip IS NOT NULL ");//查询数据库ip列所有ip
    
                using (DBUtility.DABase objDB = new DBUtility.DABase(DBUtility.DBConnectionProvider.LasterTech))
                {            
                    dt = objDB.GetDataTable(strsql.ToString().Trim());
                }    
                  //使用tcp循环访问服务端ip
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        
    		Thread t = new Thread(() => {  
    		   string strName = dt.Rows[i]["ip"].ToString();
                        DataRow dr = dd.NewRow();              
                        Socket clientScoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);      
                    clientScoket.Connect(new IPEndPoint(IPAddress.Parse(strName.ToString()), 8080));
                    if (clientScoket != null)
                    {
                        byte[] data = new byte[10240];//创建缓存区接受数据
                        clientScoket.Send(Encoding.UTF8.GetBytes("1"));  //像服务端发送固定信息
                        int count = clientScoket.Receive(data); //将接受的数据存入缓存区
                        string str = Encoding.UTF8.GetString(data, 0, count);
                        if (str.Equals("0\n"))//根据服务端回传的状态显示断开或连接(0:断开 1:连接)
                        {
                            str = "断开";
                        }
                        else
                        {
    
                            str = "连接";
                        }
                        dr["ip"] = strName.ToString();
                        dr["状态"] = str;
                        dr["工站"] = WKTION(dr["ip"].ToString());
                        dr["线别"] = LINE(dr["ip"].ToString());
    
                        dd.Rows.Add(dr.ItemArray);
                        clientScoket.Close();
                    }
                    
                    dataGridView1.DataSource = dd;
                    EquipmentstatusColor(dataGridView1);
                });
                t.Start();                               
                }
            }

    试试。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(11条)

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序