1. 程式人生 > >C#實現adsl斷線重連方法總結

C#實現adsl斷線重連方法總結

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Net.NetworkInformation;

public class AdslReconnect
{
    //找主視窗控制代碼
    [DllImport("user32.dll")]
    private static extern
IntPtr FindWindow(string lpClassName, string lpWindowName); //找子視窗控制代碼 [DllImport("user32.dll", EntryPoint = "FindWindowEx")] private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); //傳送字串 [DllImport("User32.dll"
, EntryPoint = "SendMessage")] private static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, string lParam); //列舉視窗 [DllImport("user32.dll", EntryPoint = "EnumChildWindows")] private static extern bool EnumChildWindows(IntPtr hWndParent, EnumChildWindowsProc lpEnumFunc, int
lParam); //獲取指定控制代碼類名 [DllImport("user32.dll", EntryPoint = "GetClassName")] private static extern int GetClassName(IntPtr hwnd, StringBuilder lpClassName, int nMaxCount); const int WM_SETTEXT = 0x000C;//傳送文字 const int WM_CLICK = 0x00F5;//滑鼠單擊 delegate bool EnumChildWindowsProc(IntPtr hwnd, uint lParam); delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); static IntPtr reconnection = IntPtr.Zero;//重新連線按鈕控制代碼 ///<summary> /// ADSL撥號 ///</summary> ///<param name="adslUserName">adsl使用者名稱</param> ///<param name="adslPasswd">adsl密碼</param> ///<returns></returns> public static bool DoAdsl(string adslUserName, string adslPasswd) { string username = adslUserName; string passwd = adslPasswd; //下面的這些引數都可以用Spy++查到 string lpszParentClass = "#32770"; //整個視窗的類名 string lpszParentWindow = "連線 寬頻連線"; //視窗標題 string lpszClass = "Edit"; //需要查詢的子視窗的類名,也就是輸入框 string lpszClass_Submit = "Button"; //需要查詢的Button的類名 string lpszName_Submit = "連線(&C)"; //需要查詢的Button的標題 IntPtr parentHWND = new IntPtr(0); //查到窗體,得到整個主視窗控制代碼 while (true) { parentHWND = FindWindow(lpszParentClass, lpszParentWindow); if (parentHWND != IntPtr.Zero) break; Thread.Sleep(100); } if (!parentHWND.Equals(IntPtr.Zero)) { IntPtr childHWND = new IntPtr(0); childHWND = FindWindowEx(parentHWND, childHWND, lpszClass, string.Empty);//得到User Name這個子窗體 SendMessage(childHWND, WM_SETTEXT, IntPtr.Zero, username);//呼叫SendMessage方法設定其內容 childHWND = FindWindowEx(parentHWND, childHWND, lpszClass, string.Empty);//得到Password這個子窗體 SendMessage(childHWND, WM_SETTEXT, IntPtr.Zero, passwd); childHWND = FindWindowEx(parentHWND, childHWND, lpszClass_Submit, lpszName_Submit);//得到Button這個子窗體 SendMessage(childHWND, WM_CLICK, IntPtr.Zero, "0");//觸發Click事件 Thread.Sleep(500); while (true) { if (FindWindow("#32770", "正在連線 寬頻連線...") == IntPtr.Zero)//表示連線成功 break; IntPtr errorParent = FindWindow("#32770", "連線到 寬頻連線 時出錯"); if (errorParent != IntPtr.Zero) { //獲取'重撥(&R)'按鈕控制代碼 EnumChildWindowsProc myEnumChild = new EnumChildWindowsProc(EumWinChiPro); try { EnumChildWindows(errorParent, myEnumChild, 0); } catch (Exception ex) { throw new Exception(ex.Message + "\r\n " + ex.Source + "\r\n\r\n " + ex.StackTrace.ToString()); } if (reconnection != IntPtr.Zero) SendMessage(reconnection, WM_CLICK, (IntPtr)0, "0"); } Thread.Sleep(1000); } } else { return false; } return true; } private static bool EumWinChiPro(IntPtr hWnd, uint lParam) { StringBuilder s = new StringBuilder(50); GetClassName(hWnd, s, 50); if (s.ToString() == "Button") { reconnection = hWnd; return false; } return true; } ///<summary> /// 斷網或開啟adsl連線視窗 ///</summary> ///<param name="status">false斷網,true開啟adsl視窗</param> ///<returns></returns> //private static bool SetNetworkAdapter(bool status, string adslName) //{ // string discVerb = "斷開(&O)"; // string connVerb = "連線(&O)"; // string network = "網路連線"; // string networkConnection = adslName; // string sVerb; // if (status) // { // sVerb = connVerb; // } // else // { // sVerb = discVerb; // } // Shell32.Shell sh = new Shell32.Shell(); // Shell32.Folder folder; ////Shell32.ShellSpecialFolderConstants.ssfCONTROLS // folder = sh.NameSpace(3); // try // { ////進入控制面板的所有選項 // foreach (Shell32.FolderItem myItem in folder.Items()) // { ////進入網路和拔號連線 // if (myItem.Name == network) // { // Shell32.Folder fd = (Shell32.Folder)myItem.GetFolder; // foreach (Shell32.FolderItem fi in fd.Items()) // { ////找到本地連線 // if (fi.Name.IndexOf(networkConnection) > -1) // { ////找本地連線的所有右鍵功能選單 // foreach (Shell32.FolderItemVerb Fib in fi.Verbs())//在多執行緒中,此處會報錯 // { // if (Fib.Name == sVerb) // { // Fib.DoIt(); // return true; // } // } // } // } // } // } // } // catch (Exception ex) // { // MessageBox.Show(ex.Message); // return false; // } // return false; //} ///<summary> /// adsl重連 ///</summary> ///<param name="adslUserName">使用者名稱</param> ///<param name="adslPasswd">密碼</param> ///<returns>true成功,false失敗</returns> //public static bool AdslConnection(string adslUserName, string adslPasswd, string adslName) //{ // try // { // SetNetworkAdapter(false, adslName);//斷開 // Thread.Sleep(3000); // bool isSuccess = SetNetworkAdapter(true, adslName);//重連 // if (isSuccess) // { // int result = DoAdsl(adslUserName, adslPasswd); // if (result == 3) // return true; // else // return false; // } // else // { // return false; // } // } // catch // { // return false; // } //} }

相關推薦

C#實現adsl方法總結

using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Runtime.InteropServices; using System.Window

Yii2實現mysql[轉載]

最近遇到“Yii2實現mysql斷線重連”問題,找了好久資料,最後找到這篇文件是說明了該情況的,感謝這位作者的分享,記錄下來,必備以後查閱。 原文連結:https://www.yiichina.com/topic/7296 Yii2實現資料庫斷線重連 一、前話 在工作中,有時候一

C# 判斷Socket

定時器裡面的事件 private void isConnendTimer_Tick(object sender, EventArgs e) { // 首先,Socket類的Connected屬性只表示最後一次I/

android 實現mqtt訊息推送,以及不停的問題解決

前段時間專案用到mqtt的訊息推送,整理一下程式碼,程式碼的原型是網上找的,具體哪個地址已經忘記了。 程式碼的實現是新建了一個MyMqttService,全部功能都在裡面實現,包括連伺服器,斷線重連,訂閱訊息,處理訊息,釋出訊息等基本操作。 首先新增依賴: dependencies { &

Windows C語言 Socket程式設計 client端(客戶端)--

瞭解了最基礎的C語言客戶端的編寫流程,稍稍加以改動即可實現斷線重連。 當伺服器掉線時,客戶端會以固定的頻率不停的重連。 #include <stdio.h> #include <winsock2.h> #pragma comme

C# + Socket

轉自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=28765492&id=3793532 感謝作者的分享,收藏 一、網上常用方法 1、當Socket.Conneted == false時,

Windows寬頻C#)

問題 最近電腦寬頻總是自動掉線,蛋疼啊。 在網路上下載了工具,實現自動重連,但是都帶廣告著啊,不能忍 不能忍。 思路 用C#操作寬頻連線,包括Java或者其他語言操作寬頻連線,一個很簡單的方法

Apache mina 入門(四) —— 客戶端長連線方式實現監聽

通過前面 Apache Mina 入門 (二)—— 非同步通訊機制 我們可以實現一個長連線的客戶端。但會發現一個問題,就是當網路、伺服器、應用程式出現問題而導致連線斷開後,我們的客戶端不能自動重連伺服器。導致客戶端程式癱瘓,不能使用。這個時候,通過增加一

Esp8266 進階之路26【高階篇】RTOS移植分析 MQTT 實現過程,實現移植 MQTT協議在 esp8266 rtos實時系統,可。(附帶Demo)

一、前言; esp8266的實時系統rtos是後面才出來支援的,其最後的呼叫也是呼叫樂鑫提供的API介面,所以,如果你已經玩轉了NONOS下的程式設計,那麼移植rtos程式碼是非常迅捷的,因為你已經對其的API介面非常熟悉,當然了

C# + Socket 整理

1.如果是採用TCP/udp協議進行連線,檢查windows防火牆是否開放相應SocketTCP/udp埠;   簡單的檢測方法是關閉windows防火牆後再試; 2.檢查防火牆軟體是否開放相應SocketTCP/udp埠;   簡單的檢測方法是關閉防火

使用netty進行客戶端網路程式設計及功能實現

       不管做哪個方向開發,都會有那麼一兩個牛B閃閃的庫,可以極大的方便開發,比如java網路程式設計中的netty庫。無論客戶端還是服務端網路程式設計,netty基本都是首選網路庫,健壯、高效、穩定,並且已經得到很多商業專案驗證。        當用netty進行客

zookeeper 的實現

ZooKeeper是一個分散式的,開放原始碼的分散式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要元件。 我們可以使用zookeeper做程式的健康監測(EPHEMERAL 臨時節點)、公共配置檔案、叢集管理(leader

C# Mqtt

在通過 MqttClient 客戶端連線之後,在服務端服務重啟時,客戶端如果沒有重連機制,則無法再接收到訂閱的訊息。 使用的 Mqtt 元件為:M2Mqtt.Net.dll 一些特性發現 (1)如果提供的服務端地址是不可解析的,會引發異常無法例項化 MqttClient 物件。 (2)Connect 無法

nodejs中mysql

調試 狀態 pan var 參考 ble prot nec clas 之前寫了個小程序Node News,用到了MySQL數據庫,在本地測試均沒神馬問題。放上服務器運行一段時間後,偶然發現打開頁面的時候頁面一直處於等待狀態,直到Nginx返回超時錯誤。於是上服務器檢查了遍,

django的資料庫

django每次查詢都會被把連線關閉,想保持長連線方法如下: from django.core import signals from django.db import close_connection # 取消訊號關聯,實現資料庫長連線 signals.request

【UE4】 第12講 FSocket

(版權宣告,禁止轉載) 【第03講】 實現了FSocket的連網基礎功能,這一講實現一下 斷線重連 <如果資深前輩發現有理解錯誤,還請不吝指正> <1> 建立Socket,設定阻塞模式(預設創建出來的就是阻塞模式,不用設定)  

teamtalk socket問題的查詢

之前從teamtalk的核心庫裡面剝離出一個跨平臺網路庫,一開始用的好好的,可是在某些地方使用的時候總是出怪問題,有時候斷線重連就一直連不上,導致應用失聯,在實際使用場景中一直出問題,好不尷尬。 經過連三天的苦思冥想,除錯程式碼看輸出終於有些眉目了。 我是從以下幾個方面著手解決的,特此記錄一

ActiveMQ的機制

primary active 節點 語法 無限 機制 新的 bubuko 獲取 斷線重連機制是ActiveMQ的高可用性具體體現之一。ActiveMQ提供failover機制去實現斷線重連的高可用性,可以使得連接斷開之後,不斷的重試連接到一個或多個brokerURL。 默認

關於資料庫的一點點思考

最近在寫資料庫連結池,一個不可逃避的問題就是資料庫斷線重連。 查了很多資料,因為公司有很多專案用了 TP5 於是也去看了它的原始碼。 tp5的實現其實很簡單,配置了一些資料庫連線相關的錯誤資訊關鍵詞(句),然後在執行語句時 catch 異常資訊進行比對: // 伺服器斷線標識字元 p

netty4.0 心跳檢測與操作

因為最近專案最近要用netty,服務端放在雲端,客戶端發在內網。那如何實現netty長連線和斷線重連呢(網路故障或者其他原因,客戶端要無限取重連服務端)。接下來我們看一下如何實現這個兩個功能呢。 服務端程式碼如下: package com.example.nettydem