C# TcpClient如何监测网络连接状态

studyarea 2016-04-07 02:12:15
在网上搜了好久都没有找到合适的办法,网上的方法都只是检测到一端Tcp程序关掉之后的情况,而对于拔网线之类的都没有很好的决定方法。求大神们指导!!!
...全文
1007 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
studyarea 2016-04-08
  • 打赏
  • 举报
回复
引用 2 楼 linjiagao052 的回复:

public struct OVERLAPPED
        {
            public IntPtr Internal;
            public IntPtr InternalHigh;

            public IntPtr Pointer;

            public IntPtr hEvent;
        };

        [DllImport("Iphlpapi.dll")]
        public extern static uint NotifyAddrChange(ref IntPtr handle, ref OVERLAPPED overlapped);

        [DllImport("Ws2_32.dll")]
        public extern static IntPtr WSACreateEvent();

        [DllImport("Ws2_32.dll")]
        public extern static int WSAGetLastError();

        [DllImport("Kernel32.dll")]
        public static extern int WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);

        void GetAddrChangeEvent()
        {
            OVERLAPPED overlapped = new OVERLAPPED();

            IntPtr hand = IntPtr.Zero;

            overlapped.hEvent = WSACreateEvent();


            uint ret = NotifyAddrChange(ref hand, ref overlapped);

            if (0 != ret)
            {
                if (997L != WSAGetLastError())
                {
                    // some error!
                    return;
                }
            }


            if (WaitForSingleObject(overlapped.hEvent, (int)-1) == 0)
            {
                // addr change
                // MessageBox.Show("some changed!");
            }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(GetAddrChangeEvent);
            thread.Start();
        }
没看懂,能给的注释吗?
studyarea 2016-04-08
  • 打赏
  • 举报
回复
引用 1 楼 hbu_pig 的回复:
cmd,ping ip
 Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            // 调用的是 CMD.EXE
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;

            p.Start();
            Console.Write("Try to ping " + Paras[1] + "("+Paras[Paras.Count()-1] +")"+ "\r\n");
            p.StandardInput.WriteLine("ping -n 1 " + Paras[1]);
            // ping –n 1 IP
            p.StandardInput.WriteLine("exit");
            string strRst = p.StandardOutput.ReadToEnd();
            p.Close();
            //取得输出结果
            string result;
            if (strRst.IndexOf("(0% loss)") != -1 || (strRst.IndexOf("(0% 丢失)") != -1 && (strRst.IndexOf("无法访问目标主机") == -1)))
                result = "网络正常";
            else
            {
                result =  "网络异常,请检查网络情况!";
            }
          
            return result;
谢谢
linjiagao052 2016-04-07
  • 打赏
  • 举报
回复

public struct OVERLAPPED
        {
            public IntPtr Internal;
            public IntPtr InternalHigh;

            public IntPtr Pointer;

            public IntPtr hEvent;
        };

        [DllImport("Iphlpapi.dll")]
        public extern static uint NotifyAddrChange(ref IntPtr handle, ref OVERLAPPED overlapped);

        [DllImport("Ws2_32.dll")]
        public extern static IntPtr WSACreateEvent();

        [DllImport("Ws2_32.dll")]
        public extern static int WSAGetLastError();

        [DllImport("Kernel32.dll")]
        public static extern int WaitForSingleObject(IntPtr hHandle, int dwMilliseconds);

        void GetAddrChangeEvent()
        {
            OVERLAPPED overlapped = new OVERLAPPED();

            IntPtr hand = IntPtr.Zero;

            overlapped.hEvent = WSACreateEvent();


            uint ret = NotifyAddrChange(ref hand, ref overlapped);

            if (0 != ret)
            {
                if (997L != WSAGetLastError())
                {
                    // some error!
                    return;
                }
            }


            if (WaitForSingleObject(overlapped.hEvent, (int)-1) == 0)
            {
                // addr change
                // MessageBox.Show("some changed!");
            }
        }


        private void button1_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(GetAddrChangeEvent);
            thread.Start();
        }
欢乐的小猪 2016-04-07
  • 打赏
  • 举报
回复
cmd,ping ip
 Process p = new Process();
            p.StartInfo.FileName = "cmd.exe";
            // 调用的是 CMD.EXE
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardInput = true;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;

            p.Start();
            Console.Write("Try to ping " + Paras[1] + "("+Paras[Paras.Count()-1] +")"+ "\r\n");
            p.StandardInput.WriteLine("ping -n 1 " + Paras[1]);
            // ping –n 1 IP
            p.StandardInput.WriteLine("exit");
            string strRst = p.StandardOutput.ReadToEnd();
            p.Close();
            //取得输出结果
            string result;
            if (strRst.IndexOf("(0% loss)") != -1 || (strRst.IndexOf("(0% 丢失)") != -1 && (strRst.IndexOf("无法访问目标主机") == -1)))
                result = "网络正常";
            else
            {
                result =  "网络异常,请检查网络情况!";
            }
          
            return result;

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧