❶ 如何把流量分流!!
不是軟體問題 是你設置問題 你用的是路由器吧 在上面可以設置的路由器配置指南
對路由器進行基本配置,使電腦通過路由器實現共享上網,過程相對來說比較容易實現;這篇文檔下面的內容,主要講述如下幾部分:
1, 收集並判斷信息,為配置路由器做准備;
2, 進入路由器管理界面,對路由器進行配置;
3, 配置過程簡單的故障定位排除;
讓我們快快開始,進入正題!
1, 置路由器前的准備工作(如果你對你自己的連接方式清楚,可以直接跳到第2點)
第一個需要確認的就是您的「寬頻接入方式」是怎樣的?
當然,最簡捷的辦法就是給您的ISP(互聯網服務提供商)打個電話咨詢一下;也可以通過您購買路由器以前的網路連接方式進行快速判斷。
常見的硬體連接方式有下面幾種:
1, 電話線 —> ADSL MODEM —> 電腦
2,雙絞線(乙太網線)—> 電腦
3,有線電視(同軸電纜)—> Cable MODEM —> 電腦
4,光纖 —> 光電轉換器 —> 代理伺服器 —> PC
ADSL / VDSL PPPoE :電腦上運行第三方撥號軟體如Enternet300或WinXP 系統自帶的撥號程序,填入ISP提供的賬號和密碼,每次上網前先要撥號;
或者您的ADSL MODEM 已啟用路由功能,填入了ISP提供的賬號和密碼,撥號的動作交給 MODEM 去做;(這種寬頻接入方式典型的比如南方電信提供的「 網路快車 」)
靜態IP :ISP提供給您固定的IP地址、子網掩碼、默認網關、DNS ;
動態IP :電腦的TCP/IP屬性設置為「自動獲取IP地址」,每次啟動電腦即可上網;(這種寬頻接入方式典型的比如深圳「天威視訊」)
802.1X+靜態IP :ISP提供固定的IP地址,專用撥號軟體,賬號和密碼 ;
802.1X+動態IP :ISP提供專用撥號軟體,賬號和密碼 ;
WEB認證 :每次上網之前,打開IE瀏覽器,先去ISP指定的主頁,填入ISP提供的用戶名密碼,通過認證以後才可以進行其他得上網操作;
(上面的黑體字就是您的寬頻接入方式,接入方式和硬體連接方式並不是固定搭配的)
上面提到的這些連接認證方式只是普及率比較高的一些寬頻接入方式,當然還會有其他的拓撲連接以及認證方式的存在;所以,當您不能肯定自己的寬頻方式的時候,最好向ISP咨詢:自己裝的寬頻接入,IP地址是靜態的還是動態的?認證使用的協議是PPPoE、802.1X還是WEB認證?當上面的兩個問題有了答案,就可以對路由器進行配置了;
2, 怎樣進入路由器管理界面?
先參照《用戶手冊》上面的圖示,將ADSL MODEM、路由器、電腦連結起來;
TL-R4XX系列路由器的管理地址出廠默認:IP地址:192. 168. 1. 1 ,子網掩碼:255. 255. 255. 0 (TL-R400 和TL-R400+ 兩款的管理地址默認為:192. 168. 123. 254 ,子網掩碼:255. 255. 255. 0)用網線將路由器LAN口和電腦網卡連接好,因為路由器上的乙太網口具有極性自動翻轉功能,所以無論您的網線採用直連線或交叉線都可以,需要保證的是網線水晶頭的製作牢靠穩固,水晶頭銅片沒有生銹等。
電腦桌面上右鍵點擊「網上鄰居」,選擇「屬性」,在彈出的窗口中雙擊打開「本地連接」,在彈出的窗口中點擊「屬性」,然後找尋「Internet協議(TCP/IP)」,雙擊彈出「Internet協議(TCP/IP)屬性」窗口;
在這個窗口中選擇「使用下面的IP地址」,然後在對應的位置填入:
IP地址 :192. 168. 1. X(X范圍2-254)、
子網掩碼:255. 255. 255. 0 、
默認網關:192. 168. 1. 1 ,填完以後「確定」兩次即可;
「Internet協議(TCP/IP)屬性」窗口如下:
3,檢查電腦和路由器能不能通訊?
可採用如下辦法查看,打開電腦的DOS界面:
「開始」—>「程序」,點擊「MS-DOS」 (Win98操作系統)
「開始」—>「程序」—「附件」,點擊「命令提示符」 (Win2000/XP操作系統)
一是檢查上面的IP地址配置是否生效?
在DOS窗口輸入:ipconfig/all 並回車,當看到類似如下信息,表示配置生效 ,
IP Address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : 192. 168. 1. 10
Subnet Mast . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .: 255. 255. 255. 0
Default Gateway. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : 192. 168. 1. 1
二是從電腦往路由器LAN口發送數據包,看數據包能不能返回?在DOS窗口運行:
ping 192. 168. 1. 1 –t 並回車,如果出現如下類似信息,
Reply from 192. 168. 1. 1 : bytes=32 time<10ms TTL=128 Reply from 192. 168. 1. 1 : bytes=32 time<10ms TTL=128 Reply from 192. 168. 1. 1 : bytes=32 time<10ms TTL=128 如果回車後沒有出現上面的信息,確提示輸入的命令「不是內部命令或外部命令,也不是可運行的程序或批處理程序」,則說明命令輸入有誤,請檢查空格之類的輸入是否被忽略; 4,進入路由器管理界面;出現上圖的信息,表示電腦可以和路由器通訊了,打開IE瀏覽器,在地址欄輸入 192. 168. 1. 1 並回車,正常情況下會出現要求輸入用戶名和密碼的對話框。當然,也有例外情況: 如果打開IE瀏覽器地址欄輸入地址回車,彈出「離線工作」的對話框,點即「連接」後出現撥號的小窗口,請點擊IE瀏覽器菜單欄的「工具」—「Internet選項」,在彈出的對話框內點擊「連接」屬性頁,界面如下圖: 進行了上面的操作,應該說進入路由器管理界面應該沒有什麼障礙了; 5,開始配置路由器;有了剛開始時對寬頻接入方式的信息准備,配置起來方便多了;剛進入路由器管理界面,會彈出一個類似下圖「設置向導」界面,可以取消不理它; 進入路由器管理界面,在左列菜單欄中點擊「網路參數」—>「WAN口設置」,就在這里配置路由器面向Internet方向的WAN口的工作模式,這是最關鍵的一步;
假設您的寬頻接入方式為 ADSL PPPoE ,那就選擇「WAN口連接類型」為「PPPoE」,填入「上網賬號」 、「上網口令」,如果您是包月用戶,再選擇連接模式為:「自動連接」,點擊「保存」即完成配置;保存完後「上網口令」框內填入的密碼會多出幾位,這是路由器為了安全起見專門做的;
然後您點擊管理界面左列的「運行狀態」,在運行狀態頁面「WAN口屬性」,剛開始看不到對應的IP地址子網掩碼默認網關DNS伺服器等地址,就好像下面的這幅圖,那說明路由器正在撥號過程中,等到這些地址都出現了相應的信息後,將其中的DNS伺服器地址填入電腦「Internet協議(TCP/IP)」頁面對應位置確定後,基本的設置就完成了,沒有大礙的話可以沖浪了!
正常情況下一兩分鍾內,上圖橢圓形部分會出現一系列地址,表明撥號成功;
6,故障情況列舉;
如果上圖橢圓形區域一直都沒有變,看不到任何地址,有下面幾種原因導致,請逐一排除:
1) ADSL MODEM上一般都會有一個ADSL燈,正常情況下MODEM加電並接好電話線後,這個燈會大致規律性地快慢閃爍,閃爍最終停止變為長亮;如果這個燈無休止的閃啊閃就是不長亮,請聯系並告知ISP您的ADSL MODEM同局端的交換機不能同步,這個ADSL/DSL燈長亮的條件,是必須的;
2) 在配置過程中填入「上網口令」的時候不小心輸錯,不妨重新輸入一遍;
3) ADSL MODEM 啟用了「路由模式」, 需要將ADSL MDOEM復位成「橋接模式」;怎麼復位到橋接模式可以和MODEM廠家聯系取得操作方法;也可以這樣判斷:電腦接MODEM,並且在電腦上撥號,撥號成功以後可以上網,如果是這種情況的話,則說明MODEM的工作方式是橋接模式,可以排除這一可能性;
4) ISP將電腦網卡的MAC地址幫定到了ADSL線路上;解決的辦法就是使用路由器的「MAC地址克隆」功能,將網卡的MAC地址復制到路由器的WAN口;
如果上面的可能性都排除了,ADSL PPPoE撥號一般就沒什麼問題了,下面列舉的是另2個值得關注的故障原因;
5) 您的寬頻接入方式是那種乙太網線直接引入,不是ADSL但同樣需要撥號,撥號的軟體不局限於一種,認證使用的協議也是PPPoE,但就是撥號成功不了;如果ISP承諾帶寬是10Mbps ,建議:找個10/100M自適應的集線器,將寬頻進線接在集線器上,然後再連結集線器到路由器WAN口;經過這樣一個速率適配的過程,撥號應該沒有問題的;
6) 購買路由器前,您也是通過電腦運行撥號軟體,填入用戶名口令撥號。但撥號軟體是ISP提供的專用軟體,別的軟體撥號是成功不了的;如果是這種情況,請聯系ISP咨詢一下:您的寬頻接入,認證使用的協議是802. 1X 嗎?如果是的,有種可能是認證系統在開發過程中加入私有信息,導致路由器撥號失敗;
7,其他配置
1) 安全設置
當可以正常上網了,可能出於不同的原因,您想要對內部區域網的電腦上網操作,開放不同的許可權,比如只允許登錄某些網站、只能收發E-mail、一部分有限制、一部分不限制;用戶在這方面需求差異較大,有些通過路由器可以實現,有些用路由器是沒辦法完全實現的,比如「IP地址和網卡地址綁定」這個功能,路由器不能完全做到;
我們上網的操作,其實質是電腦不斷發送請求數據包,這些請求數據包必然包含一些參數比如:源IP、目的IP、源埠、目的埠等等;路由器正是通過對這些參數的限制,來達到控制內部區域網的電腦不同上網許可權的目的;
下面我們會列舉具有代表性的配置舉例,來說明路由器「防火牆設置」、「IP地址過濾」這些功能是怎樣使用的?列舉的事例以及上面紅字部分的解釋,都是為了幫助您盡可能理解各個功能參數的含義,只有理解了參數的含義,您才可以隨心所欲的配置過濾規則,迅速實現您預期的目的,而不會因為配置錯誤導致不能使用這些功能,也不會因為由於得不到及時的技術支持而耽誤您的應用;
上圖是「防火牆設置」頁面,可以看到這是一個總開關的設置頁面,凡是沒有使用的功能,就請不要在它前面打鉤選中;
除了總開關,再有就是兩個過濾功能「預設過濾規則」的確定,何謂預設過濾規則?我們在具體規則設置頁面里,定義一些特定的規則,對符合條件的數據包進行控制處理,而這兒的「預設規則」顧名思義,限定的是我們定製的規則中沒有涉及到不符合的數據包該怎麼辦?這個應該不難理解吧;
一個數據包,要嗎符合我們設定的規則,要嗎不符合我們設定的規則但同時必定符合預設規則;
上圖就是「IP地址過濾」頁面,我們可以看到預設的過濾規則,可以填加新條目;
上圖就是詳細具體的規則設置頁面,各項參數如上;
我們配置一條規則:限制內部區域網的一台電腦,IP地址192. 168. 1. 10,只讓它登錄www.tp-link.com.cn這個網站,別的任何操作都不行;
上面這條規則可以解讀為:內網電腦往公網發送數據包,數據包的源IP地址是要限制的這台電腦的IP地址192. 168. 1. 10,數據包目的IP地址202. 96. 137. 26 ,也就是www.tp-link.com.cn這個域名對應的公網IP地址,廣域網請求因為是針對網站的限制,所以埠號是80 ;規則設置好界面如下圖:
可以在配置好的規則頁面清晰看到,規則生效時間是24小時,控制的對象是IP地址為
192. 168. 1. 10這台主機,區域網後面的埠默認不要填,廣域網IP地址欄填入的是www.tp-link.com.cn對應的公網IP地址,埠號因為是網站所以填80,協議一般默認選擇ALL就行了;是否允許通過呢?因為預設規則是禁止不符合設定規則的數據包通過路由器,所以符合設定規則的數據包允許通過,規則狀態為生效的;
上面這幅圖片新加了第二條規則,請問第二條規則設定的是什麼數據包?
如果您的規則中涉及對網站進行限制,也就是目的請求埠是80的,則應該考慮對應的將53這個埠對應數據包也允許通過,因為53對應的是去往「域名解析伺服器」的數據包,用於將域名(如www.tp-link.com.cn)和IP地址(如202. 96. 137. 26)對應的,所以必須開!
配置「IP地址過濾規則」這個功能用來實現您的一些目的,最主要的是分析都要做那些控制,然後選擇怎樣的預設規則?配置怎樣的過濾規則?如果您決心了解這個功能的真正作用,通過仔細參考資料和在路由器上反復的實驗,您一定可以完全掌握的!
❷ 兩條寬頻怎麼分流給不同的用戶
你這個可以直接通過策略路由來實現,直接在AR1上配置ACL,行為,策略,應用到介面
acl name dianxinyi 3000
rule 5 permit ip destination 192.168.1.0 0.0.0.255 //內網1網段走電信
acl name dianxiner 3001
rule 30 permit ip destination 192.168.2.0 0.0.0.255 //內網2網段走電信
traffic classifier dianxinyi
if-match acl dianxinyi
traffic classifier dianxiner
if-match acl dianxiner
traffic behavior dianxinyi
redirect ip-nexthop 61.139.2.69 //AR2的介面e0/0/0地址 ,匹配對應流量後直接修改下一跳地址
traffic behavior dianxiner
redirect ip-nexthop 10.172.216.10 //AR3的介面e0/0/0地址 ,匹配對應流量後直接修改下一跳地址
traffic policy dianxinfenliu //配置策略,匹配流量,然後進行的動作
classifier dianxinyi behavior dianxinyi
classifier dianxiner behavior dianxiner
最後將策略應用到介面,這里我建議你在路由器上做,華為的ENSP模擬器交換機沒法做策略路由實驗,有BUG,路由器上可以實現
路由器AR1
inter g 0/0/1
traffic-policy dianxinfenliu inbound //應用策略到介面,對應方向
❸ 小區寬頻怎麼再分流,具體方法怎麼設置。
從你的第一條信息可以看出是那種粗的灰黑色的網線,而不是白色的細細的電話線,自然不需要「貓」/解調器,當然,adsl還是要開機後撥號上網。(這個用路由器可以解決)
你就是想要把進入你家的這根網線分開,提供給兩台電腦上網。這樣,你直接買一個無線路由器搞定,價格100元左右,好些的300左右足矣。
把internet匯流排(即進入你家的那根線)插在路由器的匯流排埠,在花幾塊錢買兩根足夠長的網線(兩口都是介面網線),分別各自連接路由器的分輸出線埠和機箱後面板,每個路由器最多支持4+個機器上網,如果你有更多的機器,還可以用這個分流。
路由器設置很簡單,網上包括說明書上面都有(看不懂可以hi我),設置完成,可謂一勞永逸,讓後電腦開機後就自動連接不需要撥號。
具體型號沒啥要求,TP-link和D-link這兩個牌子的不錯。
根據你的補充提問:
不需要在網路鄰居-屬性中進行任何設置
買來無線路由器後只需對路由器進行簡單設置(就是把賬號密碼輸入進去,讓後路由器長久儲存,每次開機後自動撥號,同時也能提供無線信號,提供筆記本等上網)
❹ vc/mfc 進程消息隊列,線程消息隊列,和系統消息隊列,該如何處理
隊列消息和非隊列消息
從消息的發送途徑來看,消息可以分成2種:隊列消息和非隊列消息。消息隊列由可以分成系統消息隊列和線程消息隊列。系統消息隊列由Windows維護,線程消息隊列則由每個GUI線程自己進行維護,為避免給non-GUI現成創建消息隊列,所有線程產生時並沒有消息隊列,僅當線程第一次調用GDI函數數系統給線程創建一個消息隊列。隊列消息送到系統消息隊列,然後到線程消息隊列;非隊列消息直接送給目的窗口過程。
對於隊列消息,最常見的是滑鼠和鍵盤觸發的消息,例如WM_MOUSERMOVE,WM_CHAR等消息,還有一些其它的消息,例如:WM_PAINT、WM_TIMER和WM_QUIT。當滑鼠、鍵盤事件被觸發後,相應的滑鼠或鍵盤驅動程序就會把這些事件轉換成相應的消息,然後輸送到系統消息隊列,由Windows系統去進行處理。Windows系統則在適當的時機,從系統消息隊列中取出一個消息,根據前面我們所說的MSG消息結構確定消息是要被送往那個窗口,然後把取出的消息送往創建窗口的線程的相應隊列,下面的事情就該由線程消息隊列操心了,Windows開始忙自己的事情去了。線程看到自己的消息隊列中有消息,就從隊列中取出來,通過操作系統發送到合適的窗口過程去處理。
一般來講,系統總是將消息Post在消息隊列的末尾。這樣保證窗口以先進先出的順序接受消息。然而,WM_PAINT是一個例外,同一個窗口的多個 WM_PAINT被合並成一個 WM_PAINT 消息, 合並所有的無效區域到一個無效區域。合並WM_PAIN的目的是為了減少刷新窗口的次數。
非隊列消息將會繞過系統隊列和消息隊列,直接將消息發送到窗口過程,。系統發送非隊列消息通知窗口,系統發送消息通知窗口。 例如,當用戶激活一個窗口系統發送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。這些消息通知窗口它被激活了。非隊列消息也可以由當應用程序調用系統函數產生。例如,當程序調用SetWindowPos系統發送WM_WINDOWPOSCHANGED消息。一些函數也發送非隊列消息,例如下面我們要談到的函數。
消息的發送
了解了上面的這些基礎理論之後,我們就可以進行一下簡單的消息發送與接收。
把一個消息發送到窗口有3種方式:發送、寄送和廣播。
發送消息的函數有SendMessage、SendMessageCallback、SendNotifyMessage、SendMessageTimeout;寄送消息的函數主要有PostMessage、PostThreadMessage、PostQuitMessage;廣播消息的函數我知道的只有BroadcastSystemMessage、BroadcastSystemMessageEx。
SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),這個函數主要是向一個或多個窗口發送一條消息,一直等到消息被處理之後才會返回。不過需要注意的是,如果接收消息的窗口是同一個應用程序的一部分,那麼這個窗口的窗口函數就被作為一個子程序馬上被調用;如果接收消息的窗口是被另外的線程所創建的,那麼窗口系統就切換到相應的線程並且調用相應的窗口函數,這條消息不會被放進目標應用程序隊列中。函數的返回值是由接收消息的窗口的窗口函數返回,返回的值取決於被發送的消息。
PostMessage的原型如下:BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),該函數把一條消息放置到創建hWnd窗口的線程的消息隊列中,該函數不等消息被處理就馬上將控制返回。需要注意的是,如果hWnd參數為HWND_BROADCAST,那麼,消息將被寄送給系統中的所有的重疊窗口和彈出窗口,但是子窗口不會收到該消息;如果hWnd參數為NULL,則該函數類似於將dwThreadID參數設置成當前線程的標志來調用PostThreadMEssage函數。
從上面的這2個具有代表性的函數,我們可以看出消息的發送方式和寄送方式的區別所在:被發送的消息是否會被立即處理,函數是否立即返回。被發送的消息會被立即處理,處理完畢後函數才會返回;被寄送的消息不會被立即處理,他被放到一個先進先出的隊列中,一直等到應用程序空線的時候才會被處理,不過函數放置消息後立即返回。
實際上,發送消息到一個窗口處理過程和直接調用窗口處理過程之間並沒有太大的區別,他們直接的唯一區別就在於你可以要求操作系統截獲所有被發送的消息,但是不能夠截獲對窗口處理過程的直接調用。
以寄送方式發送的消息通常是與用戶輸入事件相對應的,因為這些事件不是十分緊迫,可以進行緩慢的緩沖處理,例如滑鼠、鍵盤消息會被寄送,而按鈕等消息則會被發送。
廣播消息用得比較少,BroadcastSystemMessage函數原型如下:
long BroadcastSystemMessage(DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);
該函數可以向指定的接收者發送一條消息,這些接收者可以是應用程序、可安裝的驅動程序、網路驅動程序、系統級別的設備驅動消息和他們的任意組合。需要注意的是,如果dwFlags參數是BSF_QUERY並且至少一個接收者返回了BROADCAST_QUERY_DENY,則返回值為0,如果沒有指定BSF_QUERY,則函數將消息發送給所有接收者,並且忽略其返回值。
窗口過程
窗口過程是一個用於處理所有發送到這個窗口的消息的函數。任何一個窗口類都有一個窗口過程。同一個類的窗口使用同樣的窗口過程來響應消息。 系統發送消息給窗口過程將消息數據作為參數傳遞給他,消息到來之後,按照消息類型排序進行處理,其中的參數則用來區分不同的消息,窗口過程使用參數產生合適行為。
一個窗口過程不經常忽略消息,如果他不處理,它會將消息傳回到執行默認的處理。窗口過程通過調用DefWindowProc來做這個處理。窗口過程必須return一個值作為它的消息處理結果。大多數窗口只處理小部分消息和將其他的通過DefWindowProc傳遞給系統做默認的處理。窗口過程被所有屬於同一個類的窗口共享,能為不同的窗口處理消息。下面我們來看一下具體的實例:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
消息分流器
通常的窗口過程是通過一個switch語句來實現的,這個事情很煩,有沒有更簡便的方法呢?有,那就是消息分流器,利用消息分流器,我們可以把switch語句分成更小的函數,每一個消息都對應一個小函數,這樣做的好處就是對消息更容易管理。
之所以被稱為消息分流器,就是因為它可以對任何消息進行分流。下面我們做一個函數就很清楚了:
void MsgCracker(HWND hWnd,int id,HWND hWndCtl,UINT codeNotify)
{
switch(id)
{
case ID_A:
if(codeNotify==EN_CHANGE)...
break;
case ID_B:
if(codeNotify==BN_CLICKED)...
break;
....
}
}
然後我們修改一下窗口過程:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
HANDLE_MSG(hWnd,WM_COMMAND,MsgCracker);
HANDLE_MSG(hWnd,WM_DESTROY,MsgCracker);
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
在WindowsX.h中定義了如下的HANDLE_MSG宏:
#define HANDLE_MSG(hwnd,msg,fn) \
switch(msg): return HANDLE_##msg((hwnd),(wParam),(lParam),(fn));
實際上,HANDLE_WM_XXXX都是宏,例如:HANDLE_MSG(hWnd,WM_COMMAND,MsgCracker);將被轉換成如下定義:
#define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn)\
((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0L);
好了,事情到了這一步,應該一切都明朗了。
不過,我們發現在windowsx.h裡面還有一個宏:FORWARD_WM_XXXX,我們還是那WM_COMMAND為例,進行分析:
#define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \
(void)(fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))
所以實際上,FORWARD_WM_XXXX將消息參數進行了重新構造,生成了wParam && lParam,然後調用了我們定義的函數。
MFC消息的處理實現方式
初看MFC中的各種消息,以及在頭腦中根深蒂固的C++的影響,我們可能很自然的就會想到利用C++的三大特性之一:虛擬機制來實現消息的傳遞,但是經過分析,我們看到事情並不是想我們想像的那樣,在MFC中消息是通過一種所謂的消息映射機制來處理的。
為什麼呢?在潘愛民老師翻譯的《Visual C++技術內幕》(第4版)中給出了詳細的原因說明,我再簡要的說一遍。在CWnd類中大約有110個消息,還有其它的MFC的類呢,算起來消息太多了,在C++中對程序中用到的每一個派生類都要有一個vtable,每一個虛函數在vtable中都要佔用一個4位元組大小的入口地址,這樣一來,對於每個特定類型的窗口或控制項,應用程序都需要一個440KB大小的表來支持虛擬消息控制項函數。
如果說上面的窗口或控制項可以勉強實現的話,那麼對於菜單命令消息及按鈕命令消息呢?因為不同的應用程序有不同的菜單和按鈕,我們怎麼處理呢?在MFC庫的這種消息映射系統就避免了使用大的vtable,並且能夠在處理常規Windows消息的同時處理各種各樣的應用程序的命令消息。
說白了,MFC中的消息機制其實質是一張巨大的消息及其處理函數的一一對應表,然後加上分析處理這張表的應用框架內部的一些程序代碼.這樣就可以避免在SDK編程中用到的繁瑣的CASE語句。
MFC的消息映射的基類CCmdTarget
如果你想讓你的控制項能夠進行消息映射,就必須從CCmdTarget類中派生。CCmdTarget類是MFC處理命令消息的基礎、核心。MFC為該類設計了許多成員函數和一些成員數據,基本上是為了解決消息映射問題的,所有響應消息或事件的類都從它派生,例如:應用程序類、框架類、文檔類、視圖類和各種各樣的控制項類等等,還有很多。
不過這個類裡面有2個函數對消息映射非常重要,一個是靜態成員函數DispatchCmdMsg,另一個是虛函數OnCmdMsg。
DispatchCmdMsg專門供MFC內部使用,用來分發Windows消息。OnCmdMsg用來傳遞和發送消息、更新用戶界面對象的狀態。
CCmdTarget對OnCmdMsg的默認實現:在當前命令目標(this所指)的類和基類的消息映射數組里搜索指定命令消息的消息處理函數。
這里使用虛擬函數GetMessageMap得到命令目標類的消息映射入口數組_messageEntries,然後在數組里匹配命令消息ID相同、控制通知代碼也相同的消息映射條目。其中GetMessageMap是虛擬函數,所以可以確認當前命令目標的確切類。
如果找到了一個匹配的消息映射條目,則使用DispachCmdMsg調用這個處理函數;
如果沒有找到,則使用_GetBaseMessageMap得到基類的消息映射數組,查找,直到找到或搜尋了所有的基類(到CCmdTarget)為止;
如果最後沒有找到,則返回FASLE。
每個從CCmdTarget派生的命令目標類都可以覆蓋OnCmdMsg,利用它來確定是否可以處理某條命令,如果不能,就通過調用下一命令目標的OnCmdMsg,把該命令送給下一個命令目標處理。通常,派生類覆蓋OnCmdMsg時 ,要調用基類的被覆蓋的OnCmdMsg。
在MFC框架中,一些MFC命令目標類覆蓋了OnCmdMsg,如框架窗口類覆蓋了該函數,實現了MFC的標准命令消息發送路徑。必要的話,應用程序也可以覆蓋OnCmdMsg,改變一個或多個類中的發送規定,實現與標准框架發送規定不同的發送路徑。例如,在以下情況可以作這樣的處理:在要打斷發送順序的類中把命令傳給一個非MFC默認對象;在新的非默認對象中或在可能要傳出命令的命令目標中。
消息映射的內容
通過ClassWizard為我們生成的代碼,我們可以看到,消息映射基本上分為2大部分:
在頭文件(.h)中有一個宏DECLARE_MESSAGE_MAP(),他被放在了類的末尾,是一個public屬性的;與之對應的是在實現部分(.cpp)增加了一章消息映射表,內容如下:
BEGIN_MESSAGE_MAP(當前類, 當前類的基類)
file://{{AFX_MSG_MAP(CMainFrame)
消息的入口項
file://}}AFX_MSG_MAP
END_MESSAGE_MAP()
但是僅是這兩項還遠不足以完成一條消息,要是一個消息工作,必須有以下3個部分去協作:
1.在類的定義中加入相應的函數聲明;
2.在類的消息映射表中加入相應的消息映射入口項;
3.在類的實現中加入相應的函數體;
消息的添加
有了上面的這些只是作為基礎,我們接下來就做我們最熟悉、最常用的工作:添加消息。MFC消息的添加主要有2種方法:自動/手動,我們就以這2種方法為例,說一下如何添加消息。
1、利用Class Wizard實現自動添加
在菜單中選擇View-->Class Wizard,也可以用單擊滑鼠右鍵,選擇Class Wizard,同樣可以激活Class Wizard。選擇Message Map標簽,從Class name組合框中選取我們想要添加消息的類。在Object IDs列表框中,選取類的名稱。此時, Messages列表框顯示該類的大多數(若不是全部的話)可重載成員函數和窗口消息。類重載顯示在列表的上部,以實際虛構成員函數的大小寫字母來表示。其他為窗口消息,以大寫字母出現,描述了實際窗口所能響應的消息ID。選中我們向添加的消息,單擊Add Function按鈕,Class Wizard自動將該消息添加進來。
有時候,我們想要添加的消息本應該出現在Message列表中,可是就是找不到,怎麼辦?不要著急,我們可以利用Class Wizard上Class Info標簽以擴展消息列表。在該頁中,找到Message Filter組合框,通過它可以改變首頁中Messages列表框中的選項。這里,我們選擇Window,從而顯示所有的窗口消息,一把情況下,你想要添加的消息就可以在Message列表框中出現了,如果還沒有,那就接著往下看:)
2、手動地添加消息處理函數
如果在Messages列表框中仍然看不到我們想要的消息,那麼該消息可能是被系統忽略掉或者是你自己創建的,在這種情況下,就必須自己手工添加。根據我們前面所說的消息工作的3個部件,我們一一進行處理:
1) 在類的. h文件中添加處理函數的聲明,緊接在//}}AFX_MSG行之後加入聲明,注意:一定要以afx_msg開頭。
通常,添加處理函數聲明的最好的地方是源代碼中Class Wizard維護的表下面,但是在它標記其領域的{{}}括弧外面。這些括弧中的任何東西都將會被Class Wizard銷毀。
2) 接著,在用戶類的.cpp文件中找到//}}AFX_MSG_MAP行,緊接在它之後加入消息入口項。同樣,也是放在{ {} }的外面
3) 最後,在該文件中添加消息處理函數的實體。
❺ 換了網路分流器用不了怎麼辦
首先,樓主一個概念上的錯誤。在網路設備中沒有分流器這一種說法,聽你的描述應該是交換機(SWITCH)或者是集線器(HUB)。
把你所謂的分流器更換成路由器,按說明書做好路由的設置工作,把你的台式機和筆記本分別按說明書設好IP地址和DNS等一類的地址就可以上網了。如果你不知道怎麼做,建議你在DOS下使用IPCONFIG /ALL命令查看後截圖到這里來。
❻ 一個手機上三個微信怎麼上
1、手機打開應用商店,搜索下載一個微信多開。
❼ 聯想小新筆記本為什麼插上分流器就沒有無線網
如今,筆記本電腦體積越來越小,便攜性越來越好,功能也越來越強大,漸漸代替台式電腦成為人們心目中的理想上網設備。無論是在家中還是在公司使用,只要有無線網的地方都可以使用,無需連接網線。我們都知道,無線網是通過無線路由器建立的,在使用之前要先設置好無線路由器。但是很多朋友在無線路由器設置好了之後還是會搜不到無線網路,不明白這是什麼原因。今天小編就為大家分享一下筆記本搜不到無線網的原因及解決辦法。
在找到原因之前,大家先要檢查一下自己的筆記本以及對無線路由器的設置是否正確,這些做好之後就可以開始找原因了。
1、大部分的筆記本電腦都是內置的無線網卡,因此如果搜不到無線網的話,要先看看自己的筆記本的無線 開關 是不是已經打開。如果沒有打開請先打開再搜一下試試。
注意:關於筆記本的無線網卡問題,小編要在這里說一下。有些筆記本雖然是內置的無線網卡,但是在筆記本上往往還有一個無線開關。如果無線網卡設置正常仍然搜不到無線網,很可能是這個開關沒開。這個時候大家需要通過筆記本的說明書來確認一下,或者網路查找一下也可以。
2、無線網卡想要運行是需要驅動的,因此大家可以在設備管理器當中查看一下無線網卡驅動是否成功安裝,沒有安裝請先安裝。然後再看一下無線網卡有沒有啟動。
3、看一看你的筆記本的無線服務是不是開啟了,沒有開啟的話要先開啟。開啟方法小編來介紹一下,以XP系統為例吧。
右鍵點擊「我的電腦」,選擇「管理」,再選擇「服務和應用程序」,然後在「服務」里查看「Wiressless Zero Configuration 」的狀態,如果顯示開啟,那麼雙擊它將它啟動,把啟動類型設置為「自動啟動」。
4、如果這些都檢查設置好了,那麼就檢查一下無線路由器的無線功能是不是開啟而且允許SSID廣播。檢查方法可以用其他的無線設備來搜索一下,如智能手機。如果沒有開啟或者沒有允許SSID廣播的話,那麼將它設置好。
5、還有一個原因就是有可能是無線路由器的信號不良,這時候可以將筆記本離得無線路由器近一些搜索一下,看看能不能搜到。如果還是不行,那就將無線路由器再重新設置一下,或者檢查一下無線路由器是不是壞了之類的,再不行就換個無線路由器試試。
以上就是小編分享給大家的幾種筆記本搜不到無線網的原因以及解決辦法。這些都是眾多網友在實踐當中總結出來的經驗,一般情況下都可以連接成功。如果實在不行的話,那麼可以把無線路由器重啟一下,或者恢復出廠設置。若再不行,那麼大家就聯系網通公司吧,讓他們派專業的維修技術人員來幫你解決問題,這是最有效的辦法,就是麻煩一點
❽ 魔獸世界各種宏命令對應的中文解釋!
1、由於CastSpellByName()和TargetUnit()在2.0被禁用,所以2.0之前的大部分宏將無法使用。現在,宏寫法也有了很大的變化。沒有宏可以檢查Buff,Debuff,冷卻,血量,魔法,怒氣,能量。但是,大家也不用太惋惜,現在的宏可以實現許多新的功能,並且非常強大。
2、在使用一些宏之前請先檢查你的按鍵設置。系統默認Ctrl+1到10是使用寵物技能欄,而Shift+1到6是選定動作條。有些宏在使用時由於自己的設置有可能和這些默認的按鍵沖突,解決辦法為改宏或者改掉系統默認的按鍵設置。
3、把這篇文章一字不漏的看完,那麼95%的宏你都可以自己寫了。
身上各個部位編號:
1:頭
2:頸
3:肩
4:襯衣
5:胸
6:腰帶
7:腿
8:腳
9:手腕
10:手套
11:手指1
12:手指2
13:飾品1
14:飾品2
15:背
16:主手
17:副手
18:遠程武器
動作條編號:
主動作條1為 1--12
主動作條2為13--24
主動作條3(右1)為25--36
主動作條4(右2)為37--48
主動作條5(右下)為49--60
主動作條6(左下)為61--72
背包及包裹格子編號:
背包從右到左的編號分別是:4、3、2、1、0~
包裹格子的編號是從左至右排列,一個包的第一行分別是:1、2、3、4~
然後是包裹第2行:5、6、7、8~下面幾行依次類推。
宏命令講解:
/cast
簡單的說就是/施放,並且使用這個命令的宏只有一個法術會被施放。現在的這個命令可以加入條件來判定法術是否被施放。比如「/cast [help,combat] 快速治療」,這個宏的意思是當目標為友善,並且在戰斗中,那麼施放快速治療。
可用的條件:
help-判斷目標是否為友善;
harm-判斷目標是否為敵對;
combat-判斷你是否在戰斗中;
stance或stance:#-判斷你是否在姿態中或是否在指定姿態中;
stealth-判斷你是否在潛行;
modifier或modifier:x(x可為shift、ctrl、alt 或者是它們的組合)判斷某個或某幾個按鍵是否被按下。
equipped:<item>-判斷某件物品是否在裝備中。<item>可以是裝備欄編號、裝備分類(武器、副手。。。)、裝備子類(雙手劍、法仗等等。。。)
target=<unit>-可以把技能目標指定為任何有效的目標,並且可以另你不丟失當前目標!<unit>還可以為「none」,用來指定沒有目標的時候。「self」,用來指定只對自己施放。比如「/use [target=self] 厚符文布綳帶」,無論任何時候都只對自己使用綳帶。
actionbar:<number>-判斷當前動作條是否被列出。<number>可為1、2、3、4、5、6~
pet:<pet type 或 pet name>-pet type為寵物類型;pet name為寵物名字。如果不填寫寵物類型或名字則判斷寵物是否存在。
mounted-判斷是否在坐騎上。
swimming-判斷是否在游泳。
flying-判斷是否在飛行中。
outdoors-判斷你是否在室外。
indoors-判斷你是否在室內。
button:<#>判斷某個特定按鈕是否被用來觸發技能。<#>可為1(滑鼠左鍵)、2(滑鼠右鍵)、3(滑鼠按鍵3,也就是滑鼠滾輪向下按,不是向上滾也不是向下滾)、4(滑鼠按鍵4,多鍵滑鼠專用)、5(滑鼠按鍵5,多鍵滑鼠專用)。默認為1。
channeling-判斷你是否在引導法術。
channeling:法術名稱-判斷你是否在引導特定的法術。
exists-判斷特定目標是否存在。
dead-判斷目標是否死亡。
stance:<#>-判斷是否在姿態中,默認為1(只寫stance不寫編號為默認)。牧師的暗影形態,盜賊的潛行都為1。
戰士:1戰斗、2防禦、3狂暴
德魯伊:1熊、2海豹?、3貓、4旅行、5梟獸/樹
equipped:裝備名稱/類型/子類型-判斷某件裝備是否在裝備中。比如「/cast [equipped:魔杖] 射擊」,這個宏的意思是如果裝備魔杖就使用射擊。
/castsequence
連續點擊可以按順序施放指定法術。一個法術施放失敗,後面的法術就不會被施放。
常使用的條件選相:
reset=<#>或target或combat或它們的組合,其他同「/cast」。
簡單介紹一下<#>/target/combat的作用。
<#>-代表數字,一般都是1到1800,單位為秒。/castsequence reset=120 部落徽記,亡靈意志,這個宏的功能是先使用部落徽記,然後使用亡靈意志。如果120秒後亡靈意志依然沒有被施放那麼還是使用部落徽記。但是, reset=<#>永遠都是在你施放最後一個法術的時候開始記時。
target-切換目標時重至宏。
combat-戰斗開始時重至宏。
所有條件都可以在前面加「no」來達到相反的效果!比如「nocombat」,判斷你是否不在戰斗。
「,」相當於以前的and。比如「/cast [help,combat]快速治療」,這句的意思就是目標為友方並且在戰斗中時使用快速治療。
「/」相當於以前的or。
/castrandom
隨機施放法術,比如「/castrandom 變形術:豬,變形術:羊,變形術:龜」。(我變~我變~我變變變!)
/use
使用物品或裝備,不再需要指定編號。比如「/use 厚符文布綳帶」。
/userandom
隨即使用指定的幾件物品。
目標選定:
/targetenemy
選定一個敵對目標。
/targetfriend
選定一個友善目標。
/targetparty
選定一個小隊隊友為目標。
/targetraid
選定一個團隊隊友為目標。
/targetlasttarget
選定上個目標。
/targetlastenemy
選定上個敵對目標。
/assist
協助~同「/協助」。
寵物類:
/petattack
寵物攻擊。
/petstay
寵物停止。
/petfollow
寵物跟隨。
/petpassive
寵物被動形態。
/petdefensive
寵物防禦形態。
/petaggressive
寵物攻擊形態。
/petautocaston 法術名稱
寵物法術自動施放開啟。
/petautocastoff 法術名稱
寵物法術自動施放關閉。
/focus
一直鎖定一個目標~比如把這個命令和寵物攻擊結合做一個宏。再比如你當前的寵物是MM,並且用這個宏讓MM去攻擊一個戰士,然後你切換了目標,並讓MM施放誘惑,這時MM誘惑的目標不會是你當前的目標,而是剛才的那個戰士。
# show <法術名稱/物品名稱>
這個命令可以讓你的宏顯示指定法術或物品的圖標。
/cancelaura
取消BUFF~比如「/cancelaura 奧術智慧」。
/stopmacro [option]
停止宏,可加條件判定。這里有一個特殊的例子:
/cast [harm] 變形術
/stopmacro [noharm]
/p 正在把%t變羊!別去碰它!
如果變形術施放失敗,那麼就不會在小隊內說話。
/click
點擊?貌似是的。和「/cast」一樣何以加事件判斷。
實例:/click [pet:虛空行者]PetActionButton1
還要說的一個重點內容:「PetActionButton1」,1可以改為1-10任何一個數,意思就是寵物技能欄的1-10。
最後,送大家兩個宏:
/console SET targetNearestDistance "50"
將「TAB」能選定目標的最遠距離改為50碼。
/console SET targetNearestDistanceRadius "50"
將「TAB」能選定身後目標的最遠距離設為50碼,不過並不推薦這么做,20就夠了。
學習實踐這個帖子的小經驗和小問題
學習實踐這個帖子的小經驗和小問題,終於可以用簡體字了,我真不易..
因為在tf玩,所以下面有繁體字,技能名有出入...
先談經驗:
1.不要直接 別人的代碼到以下文件中:
"盤符:\Program Files\World of Warcraft\WTF\Account\帳號名\伺服器名\人物名\macros-cache.txt"
容易出問題,我就遇到過2行代碼,死活不靈,在游戲里重新輸入一遍,就好了 =..=
2.在宏里加一個"#showtooltip",看技能效果很方便,特別是"3吸取"那種宏,開始不熟悉快捷鍵可以看看.
3.不要亂添分號 ";":
但凡與寫代碼沾一點邊的人,一行字結尾不加個";"就全身不舒服.....以懶人練級宏為例:
#showtooltip
/castsequence [nomodifier] reset=combat/target 生命虹吸,痛苦詛咒,腐蝕術,獻祭,吸取生命,吸取生命;
/cast [modifier:alt]吸取靈魂;[modifier:ctrl]吸取法力;[modifier:shift]吸取生命;
這是一個錯誤的示範,加了";",後面的3吸取就沒有效果了,要去掉....
4.宏的圖標選擇,請多試試圖標選擇面板里的第一個"問號圖標".
以亡靈意志宏為例,圖標選擇"?",如果看看macros-cache.txt,圖標名就是"INV_Misc_QuestionMark"
#showtooltip
/stopcasting
/cast [nomodifier]防護暗影結界;[modifier:alt]亡靈意志
這個宏在我的技能欄1的第5格上,按5就是暗防,按alt+5就是反恐.
當選擇問號圖標並拖到技能欄以後,問號圖標就顯示"防護暗影結界"的圖標了,會顯示該技能cd,當你按下"alt"(注意還不是"alt+5"),該圖標自己變化為"亡靈意志",並且顯示的是"亡靈意志"的cd.
上面經驗3里那個宏我就用的問號圖標,特方便看現在該施放哪一個技能了.懶要懶出境界,好比ui區的一個版主..
再來談談問題:
問題1:
在上面經驗4的宏,按下ctrl或者shift時候,圖標仍然是"防護暗影結界",但下面這個宏:
#showtooltip
/cast [nomodifier]生命分流;[modifier:alt]魔甲術;
如果按下ctrl或者shift時候,圖標卻變化為"?",當然手指抬起後,會正常不影響使用,不知是我個體的原因,還是什麼,還請大家幫忙看看.
問題2:
在放火雨,或者搓暗蛋的時候,我想打斷咒語吟唱,一般是後退2步,有沒有宏可以直接打斷?
/stopcasting 可以打斷爐石,但是不能打斷火雨什麼的.
如果沒有這種宏,能讓我後退一步的宏也可以 =..=
問題3:
在wow2里我想在施放一個技能時候隨機說一句話的宏如何寫,前面那個綁定石頭的好像不合適,以前那個跑龍套的喊話宏好像也不好用.
比如:
#showtooltip
/stopcasting
/cast 恐懼術
----------------------------------------------------------------
實用的自己搞定吧 喜歡什麼做什麼 別人的肯定不大適應
❾ 華為三層交換機多埠聚集鏡像的命令
先指定一個本地鏡像口observe-port 1 interface XXXX
然後在你需要鏡像的埠下用port-mirroring to observe-port 1 後面跟inbound、outbound或者both就可以了
❿ LAN和WLAN雙網卡分流
需要合理配置路由
舉例而言,公司存在tplink無線網路,為192.168.1.*網段,網關為192.168.1.1;有線網路為10.99.31.*網段,網關為10.99.31.2;要實現訪問外網時使用無線,內網使用有線,則配置方法為:
1:運行CMD
2:route delete 0.0.0.0 mask 0.0.0.0 10.99.31.2
刪除所有網路連接都從網關10.99.31.2走這條路徑;
3:route add 10.0.0.0 mask 255.0.0.0 10.99.31.2 metric 1
增加內網連接走內網網關路徑;如果在該命令後加 -p參數將重新啟動後命令有效,無需每次寫這條命令了,只需要運行2就可以了。
可以將以上命令整合為一個bat文件,保存到所有程序項裡面。在雙網路都連接成功後,運行該bat文件就可以了。
關於Metric:
metric是路由演算法用以確定到達目的地的最佳路徑的計量標准,常用的metric值有:路徑長度,可靠性,延遲,帶寬,負載,通信代價等..
metric值的作用很大,我們常用它來計算路由的優先順序,如兩條到達相同網路的靜態路由,metric小的優先順序高;
因此,我們可以通過合理設置metric值來達到三個及三個以上多網路存在時的路由配置。
解釋:
默認網關為無線環境tplink的192.168.1.1,所有的網路數據請求都將通過這個網關出去,也就是說所有的網路請求都從無線出去。
persistent routes列表代表所有10網段的都從有線的網關10.99.31.2出去,也就是說所有屬於10網段的請求都從有線出去。通過這個路由來控制內網連接,也就是無線路由配置中所有網路請求走無線環境的例外!
另外,如果網路環境中配置有自動配置腳本,那麼,配置腳本的優先順序最高。網路的數據請求將按照配置腳本的配置實現。在此例中,如果有自動配置腳本proxy.pac,那麼優先順序別為proxy.pac>192.168.1.1>10.99.31.2;