国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

PC屏幕加解鎖無線控制程序設(shè)計(jì)與實(shí)現(xiàn)

2015-12-20 01:09邢海峰
電子科技 2015年3期
關(guān)鍵詞:鉤子控制程序服務(wù)端

邢海峰

(內(nèi)蒙古財(cái)經(jīng)大學(xué)計(jì)算機(jī)信息管理學(xué)院,內(nèi)蒙古呼和浩特 010050)

隨著計(jì)算機(jī)系統(tǒng)的普及,人們工作學(xué)習(xí)基本均可通過計(jì)算機(jī)系統(tǒng)的輔助完成,而大量的工作學(xué)習(xí)資料和成果將以虛擬數(shù)字資料的形式保存,這對(duì)提高人們的工作學(xué)習(xí)效率、節(jié)約工作學(xué)習(xí)成本有較大的幫助,但其也帶來了諸多負(fù)面影響,如非法入侵、信息泄露、未授權(quán)使用計(jì)算機(jī)等,所以計(jì)算機(jī)安全成為數(shù)字化時(shí)代面臨的嚴(yán)峻問題。

基于此,本文提出了一種基于Socket數(shù)據(jù)傳輸技術(shù),用于實(shí)現(xiàn)個(gè)人計(jì)算機(jī)屏幕加解鎖的無線控制程序設(shè)計(jì)方法,該程序是為了幫助提高個(gè)人計(jì)算機(jī)安全性,允許使用者通過個(gè)人手機(jī)來完成對(duì)個(gè)人計(jì)算機(jī)屏幕的鎖屏及解鎖控制。這不但有效地防止了外人對(duì)他人計(jì)算機(jī)的非法使用,保證個(gè)人信息安全,同時(shí),由于計(jì)算機(jī)的主人在無線局域網(wǎng)覆蓋的任何位置均可方便的控制計(jì)算機(jī),所以計(jì)算機(jī)控制不受空間的約束,為使用者帶來便利。

1 設(shè)計(jì)原理

1.1 框架設(shè)計(jì)

設(shè)計(jì)實(shí)現(xiàn)的控制程序主要利用Android平臺(tái)作為控制端,通過WiFi方式接收信息并傳送進(jìn)入局域網(wǎng),然后通過局域網(wǎng)將信號(hào)傳遞到受控端的PC機(jī)實(shí)現(xiàn)對(duì)個(gè)人計(jì)算機(jī)屏幕加鎖及解鎖控制??刂瞥绦蛟砜蚣苋鐖D1所示。

圖1 控制程序原理框架圖

由控制程序原理框架圖可知,該程序有兩部分:移動(dòng)客戶端實(shí)現(xiàn)接收用戶控制信息;被控端接收用戶發(fā)送控制信息。被控信息傳輸過程為:移動(dòng)終端發(fā)送控制信息到無線路由器,無線路由器接收控制信息并路由,控制信息通過局域網(wǎng)傳送到被控計(jì)算機(jī)。

由于Android移動(dòng)平臺(tái)隨處可得,常見的如用戶手中的Android手機(jī)就是最佳選擇,所以將用戶的手機(jī)作為客戶端即經(jīng)濟(jì)又不影響便攜性,則可將客戶端的控制程序部署到用戶的手機(jī)中,而被控計(jì)算機(jī)端可以開發(fā)部署一個(gè)負(fù)責(zé)接受、解析客戶端信息,然后根據(jù)解析信息來實(shí)現(xiàn)用戶控制意圖的服務(wù)端程序即可。因?yàn)橛脩艨刂朴?jì)算機(jī)數(shù)量不一定是1臺(tái),有可能工作中需要兩臺(tái)或以上同時(shí)工作,為保證多臺(tái)計(jì)算機(jī)同時(shí)得到控制,可采用基于UDP/IP協(xié)議的數(shù)據(jù)報(bào)方式的Socket技術(shù)來實(shí)現(xiàn)客戶端與服務(wù)端的數(shù)據(jù)傳輸??刂瞥绦驑I(yè)務(wù)流程如圖2所示。

圖2 控制程序業(yè)務(wù)流程

1.2 核心技術(shù)

1.2.1 Socket套接字

Socket[1]也稱為“套接字”,應(yīng)用程序通過“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。Socket有兩種實(shí)現(xiàn)方式,即流式Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用,一般多用于實(shí)現(xiàn)可靠的點(diǎn)對(duì)點(diǎn)的數(shù)據(jù)傳輸;數(shù)據(jù)報(bào)式Socket是一種面向無連接的UDP服務(wù)應(yīng)用,通常多用在實(shí)現(xiàn)具有廣播功能的數(shù)據(jù)傳輸。

因在實(shí)際工作學(xué)習(xí)中可能出現(xiàn)一個(gè)用戶同時(shí)使用多臺(tái)計(jì)算機(jī)的情況,所以計(jì)算機(jī)屏幕加解鎖控制程序要實(shí)現(xiàn)客戶終端到被控設(shè)備的一對(duì)多數(shù)據(jù)傳輸,所以最佳的“套接字”傳輸方式應(yīng)為非面向連接的數(shù)據(jù)報(bào)“套接字”。非面向連接的數(shù)據(jù)報(bào)“套接字”傳輸數(shù)據(jù)的工作過程無需建立可靠連接,因此數(shù)據(jù)傳輸過程要比面向連接少一個(gè)建立連接的環(huán)節(jié),客戶端僅需要向被控服務(wù)端直接發(fā)送信息即可。

由于服務(wù)端程序除了要負(fù)責(zé)接收客戶端通過Socket發(fā)來的控制信息之外,更重要的是還需要根據(jù)控制信息實(shí)現(xiàn)對(duì)被控服務(wù)端的屏幕鎖屏及解鎖操作,而實(shí)現(xiàn)屏幕加解屏必須重寫Windons系統(tǒng)的相應(yīng)鉤子函數(shù)來實(shí)現(xiàn)系統(tǒng)硬件層的屏蔽工作,則選擇C語言實(shí)現(xiàn)服務(wù)端程序。在C語言中提供了數(shù)據(jù)報(bào)方式Socket[2]的接口函數(shù)及Socket數(shù)據(jù)存放結(jié)構(gòu),它們被定義在winsock.h或winsock2.h頭文件中。

客戶端是Android平臺(tái)的手機(jī),所以使用Java語言開發(fā)較方便。在Java中對(duì)兩種方式的Socket[3]均提供了支持。Java中用于支持流式Socket有Socket和ServerSocket類,Socket類為客戶端提供全部接口,ServerSocket類為服務(wù)端提供全部接口。Java用于支持?jǐn)?shù)據(jù)報(bào)方式的Socket被封裝在DatagramSocket類中,同時(shí)提供了DatagramPacket類來封裝Socket數(shù)據(jù)。

需要注意的是,由于客戶端和服務(wù)端實(shí)現(xiàn)Socket的語言不同,而不同語言在獲取Socket數(shù)據(jù)的類型可能存在差異,所以當(dāng)發(fā)送接收數(shù)據(jù)時(shí)需要對(duì)數(shù)據(jù)進(jìn)行一些必要的類型處理。

1.2.2 屏幕加解鎖原理

屏幕加鎖是通過屏蔽系統(tǒng)標(biāo)準(zhǔn)輸入外設(shè)的輸入來實(shí)現(xiàn)。理論上有兩種方法可以實(shí)現(xiàn)該項(xiàng)功能:(1)直接修改處理器內(nèi)部負(fù)責(zé)管理輸入中斷的寄存器值,將管理外部輸入設(shè)備的中斷位屏蔽,使硬件系統(tǒng)不能得到外部中斷,進(jìn)而實(shí)現(xiàn)鎖屏功能。(2)不修改任何硬件寄存器值,僅是通過一些軟件技術(shù),使操作系統(tǒng)忽略外設(shè)的輸入中斷請(qǐng)求,從而實(shí)現(xiàn)鎖屏的功能。由于實(shí)現(xiàn)鎖屏功能時(shí),操作系統(tǒng)已經(jīng)處于運(yùn)行狀態(tài),其會(huì)通過自身定義的安全策略對(duì)底層的硬件加以保護(hù),所以要采用直接修改硬件寄存器的方法來實(shí)現(xiàn)鎖屏難度較大。再者,即使能夠突破操作系統(tǒng)的保護(hù)直接修改硬件寄存器值,對(duì)系統(tǒng)本身的安全性也是一種潛在威脅,所以第2種是較好的選擇方案。而解鎖功能與加鎖正好相反。

Windows系統(tǒng)在設(shè)計(jì)時(shí)就為高級(jí)用戶預(yù)留了一項(xiàng)稱為鉤子[4-5]的功能,用戶可通過調(diào)用鉤子安裝函數(shù)SetWindowsHookEx將自己實(shí)現(xiàn)的鉤子掛到Windows系統(tǒng)中。正是通過自身定義的鉤子函數(shù),無論是系統(tǒng)的開發(fā)維護(hù)人員,還是系統(tǒng)高級(jí)外圍程序員均可完成一些能夠影響系統(tǒng)的行為工作。如本文要實(shí)現(xiàn)的加減鎖控制程序便可使用Windows的鉤子來實(shí)現(xiàn)。

Windows中鉤子的實(shí)現(xiàn)有兩種方式:內(nèi)部鉤子、全局鉤子。內(nèi)部鉤子只能影響當(dāng)前運(yùn)行的進(jìn)程行為,而全局鉤子可影響所有運(yùn)行進(jìn)程,但全局鉤子實(shí)現(xiàn)需要采用動(dòng)態(tài)鏈接庫方式,所以在本文所實(shí)現(xiàn)的服務(wù)端程序的核心鎖屏及解鎖功能要以動(dòng)態(tài)連接庫的方式連接到主程序中。

分析了所使用的加鎖及解鎖技術(shù)原理后,為了提高控制程序自身的安全性,防止非法用戶通過使用用戶手機(jī)來控制用戶計(jì)算機(jī),提出一種簡(jiǎn)單有效的方法來保證控制程序的安全性。

首先,服務(wù)端程序開始運(yùn)行時(shí)需要用戶輸入一組密碼,該密碼的生存期從輸入結(jié)束開始,到服務(wù)端程序結(jié)束終止;其次,當(dāng)用戶需要啟動(dòng)手機(jī)客戶端程序控制計(jì)算機(jī)時(shí),需要用戶提供服務(wù)端密碼。當(dāng)用戶提供了正確的密碼,客戶端程序會(huì)將密碼和控制信號(hào)封裝發(fā)送到服務(wù)端;服務(wù)端接收到數(shù)據(jù)后,按照數(shù)據(jù)封裝順序解析密碼和控制信號(hào),根據(jù)密碼驗(yàn)證身份,身份正確后執(zhí)行相應(yīng)的屏幕控制行為。數(shù)據(jù)封裝及解析過程如圖3所示。

圖3 數(shù)據(jù)封裝及解析

1.2.3 Android應(yīng)用開發(fā)原理

(1)Android應(yīng)用程序組成。Android應(yīng)用程序是由組件組成,而組件是可調(diào)用的基本功能模塊。Android系統(tǒng)有4 個(gè)重要組件分別是[6]:Activity、Service、BroadcaseReceiver和ContentProvider;Activity是Android程序的呈現(xiàn)層,顯示可視化的用戶界面,并接收與用戶交互所產(chǎn)生的界面事件;Service用于沒有用戶界面,但需要長(zhǎng)時(shí)間在后臺(tái)運(yùn)行的應(yīng)用;ContentProvider是Android系統(tǒng)提供的一種標(biāo)準(zhǔn)的共享數(shù)據(jù)的機(jī)制,應(yīng)用程序可通過ContentProvider訪問其他應(yīng)用程序存儲(chǔ)在文件系統(tǒng)中的文件,也可以是SQLite中數(shù)據(jù)庫的私有數(shù)據(jù);Broadcase-Receiver是用于接受并響應(yīng)廣播消息的組件,不包含任何用戶界面,可通過啟動(dòng)Activity或Notification通知用戶接收到重要信息。

(2)組件生命周期。所有Android組件都具有自己的生命周期[7],是從組件建立到組件銷毀的整個(gè)過程。在生命周期中,組件會(huì)在可見、不可見、活動(dòng)、非活動(dòng)等狀態(tài)中不斷變化。介紹控制系統(tǒng)中使用的Activity生命周期,如圖4所示。

圖4 Activity生命周期

Activity生命周期指Activity從啟動(dòng)到銷毀的過程,Activity表現(xiàn)為4種狀態(tài),分別是活動(dòng)狀態(tài)、暫停狀態(tài)、停止?fàn)顟B(tài)和非活動(dòng)狀態(tài)。

活動(dòng)狀態(tài):Activity在用戶界面中處于最上層,用戶可見,實(shí)現(xiàn)用戶交互。

暫停狀態(tài):Activity在界面上被部分遮擋,該Activity不再處于用戶界面的最上層,且不能夠與用戶進(jìn)行交互。

停止?fàn)顟B(tài):Activity在界面上完全不能被用戶看到,也就是說這個(gè)Activity被其他Activity全部遮擋。

非活動(dòng)狀態(tài)不在以上3種狀態(tài)中的Activity則處于非活動(dòng)狀態(tài)。

(3)組件的回調(diào)函數(shù)。Android系統(tǒng)的Activity組件提供了7個(gè)回調(diào)函數(shù)來控制該組件的創(chuàng)建、狀態(tài)變化及銷毀,分別為 onCreate、onStart、onRestart、onResume、onPause、onStop、onDestroy。

(4)Android應(yīng)用程序間消息傳遞。Android系統(tǒng)中采用稱為意圖的Intent類來實(shí)現(xiàn)不同應(yīng)用程序間的信息傳遞。Intent[8]可劃分為顯式意圖和隱式意圖兩種。顯式意圖:調(diào)用Intent.setComponent()或Intent.setClass()方法指定組件名或類對(duì)象。隱式意圖:Android系統(tǒng)會(huì)根據(jù)隱式意圖中設(shè)置的動(dòng)作(Action)、類別(Category)、數(shù)據(jù)(URI和數(shù)據(jù)類型)找到最合適的組件來處理這個(gè)意圖。

2 程序?qū)崿F(xiàn)

2.1 客戶端實(shí)現(xiàn)

客戶端功能由Java語言封裝的控制主類MainActivity來實(shí)現(xiàn),主類繼承了Android組件Activity。

客戶端主控制類MainActivity中使用的MangicPackage類封裝了數(shù)據(jù)報(bào)Socket的操作。

public class MangicPackage{

public boolean sendMessages(String str)throws IOException{

int port=9999;//端口號(hào)大于1024

String destIP=“255.255.255.255”;//廣播地址

//檢測(cè)地址,并將其轉(zhuǎn)換為二進(jìn)制

InetAddress destHost=null;

try{destHost=InetAddress.getByName(destIP);

}

catch(UnknownHostException e){e-.printStackTrace();}

//建立Socket數(shù)據(jù)包

byte[]magicBytes=str.getBytes();

DatagramPacket dp=null;

dp=new DatagramPacket(magicBytes,magicBytes.length,destHost,port);

DatagramSocket ds=new DatagramSocket();

ds.send(dp);//發(fā)送數(shù)據(jù)

ds.close();//關(guān)閉 Socket

return true;

}

}

2.2 服務(wù)端實(shí)現(xiàn)

服務(wù)端程序主要任務(wù)有兩個(gè),首先利用Socket來監(jiān)聽客戶端的控制信息,然后解碼信息,根據(jù)解碼信息來實(shí)現(xiàn)鎖屏或解屏操作。采用動(dòng)態(tài)連接庫方式實(shí)現(xiàn)全局鉤子,鉤子中完成鎖屏及解屏。

HHOOK hKey=NULL;//保存鍵盤消息鉤子句柄

HHOOK hMouse=NULL;//保存鼠標(biāo)消息鉤子句柄

HINSTANCE hInst=NULL;

BOOL WINAPI DllMain(HINSTANCE hInstance,DWORD reason,LPVOID lpVoid)

{hInst=hInstance;

return true;

}

//屏蔽鼠標(biāo)的鉤子

LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM wParam)

{

if(nCode<0)//wParam和wParam中沒有關(guān)于鼠標(biāo)的消息

return CallNextHookEx(hMouse,nCode,wParam,lParam);

//屏蔽鼠標(biāo)右鍵按下及彈起信息

if(wParam==WM_RBUTTONDOWN||wParam==WM_RBUTTONUP)

return 1;

//屏蔽鼠標(biāo)移動(dòng)

if(wParam==WM_MOUSEMOVE)

return 1

//屏蔽鼠標(biāo)左鍵按下及彈起信息

if(wParam==WM_LBUTTONDOWN||wParam==WM_LBUTTONUP)

return 1;

else

return CallNextHookEx(hMouse,nCode,wParam,lParam);

}

//屏蔽鍵盤鉤子

LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam,LPARAM lParam)

{

if(VK_F2==wParam && (lParam > >29&1)==1)

{

UnhookWindowsHookEx(hMouse);hMouse=NULL;

UnhookWindowsHookEx(hKey);hKey=NULL;

}

return 1;

}

//掛載鉤子

EXPORT BOOL CALLBACK HookOn()

{

if(!hInst)

return false;

if(hKey||hMouse)

return false;

//函數(shù)的第四個(gè)參數(shù)為0,表示全局鉤子

hMouse=SetWindowsHookEx(WH_MOUSE_LL,MouseProc,hInst,0);

hKey=SetWindowsHookEx(WH_KEYBOARD_LL,KeyBoardProc,hInst,0);

return hKey&& hMouse;

}

//卸載鉤子

EXPORT BOOL CALLBACK HookOff()

{

BOOL bRetMouse=false,bRetKey=false;

if(hMouse)

bRetMouse = UnhookWindowsHookEx(hMouse);

if(hKey)

bRetKey=UnhookWindowsHookEx(hKey);

if(bRetKey&& bRetMouse)

{

hKey=hMouse=NULL;

return true;

}

return false;}

注意鎖鍵盤鉤子,本文特意留出解鎖后門,防止因不可預(yù)料意外導(dǎo)致屏幕無法解鎖,后門熱鍵是“Alt+F2”,當(dāng)然可設(shè)為任意。把動(dòng)態(tài)鏈接庫文件編譯生成dll文件,然后拷貝到服務(wù)端主控程序的目錄中,開始實(shí)現(xiàn)服務(wù)端主控程序,主控程序核心控制功能通過創(chuàng)建一個(gè)線程ControlThread來處理。

void ControlThread(HINSTANCE hInstance)

{TCHAR Tmp[256]=“”;

char ctrl;

WSADATA wWsadata;

WORD wWord;

wWord=MAKEWORD(1,1);

if(!WSAStartup(wWord,&wWsadata))//裝載指定Socket

{//創(chuàng)建數(shù)據(jù)報(bào)SOCKET

SOCKET sock;

if((sock=socket(AF_INET,SOCK_DGRAM,0))!=INVALID_SOCKET)

{//本地地址與端口綁定

SOCKADDR_IN addr;

addr.sin_addr.s_addr=htonl(INADDR_ANY);//轉(zhuǎn)換本地地址格式

addr.sin_family=AF_INET;

addr.sin_port=htons(9999);//端口號(hào)大于1024

//綁定

bind(sock,(SOCKADDR*)&addr,sizeof(SOCKADDR));

SOCKADDR_IN addrClient;//收到數(shù)據(jù)后,存儲(chǔ)客戶端的地址

int len=sizeof(SOCKADDR);

while(1)

{//接收數(shù)據(jù)開始,buf是定義的全局字符串變量

recvfrom(sock,buf,RECVLEN,0,(SOCKADDR*)&addrClient,&len);

int len=strlen(buf);

strcpy(Tmp,buf);

ctrl=Tmp[len-1];

switch(ctrl)

{case‘1’:if(屏幕沒有鎖)HookOn();

break;

case‘2’:if(屏幕被鎖)HookOff();

break;

}

}

closesocket(sock);

WSACleanup();

}//卸載 Socket

}}

3 程序部署測(cè)試

3.1 程序部署

手機(jī)客戶端:首先確定手機(jī)Android平臺(tái)版本為2.3或以上,因客戶端程序開發(fā)基于Android 2.3版本的開發(fā)包,然后下載該系統(tǒng)客戶端生成的apk文件,直接點(diǎn)擊安裝即可??蛻舳顺绦虬惭b及運(yùn)行如圖4所示。

圖4 客戶端界面

PC服務(wù)端:將C語言編寫的主程序編譯的可執(zhí)行程序和主程序調(diào)用的全局鉤子動(dòng)態(tài)鏈接庫dll文件一同復(fù)制到C盤根目錄下即可。然后點(diǎn)擊啟動(dòng)主程序,服務(wù)端程序處于接收客戶端信號(hào)狀態(tài)。服務(wù)端程序運(yùn)行如圖5所示。

圖5 服務(wù)端程序界面

3.2 程序測(cè)試

首先保證局域網(wǎng)當(dāng)中的無線WiFi暢通,打開手機(jī)的無線連接且查驗(yàn)連接成功,然后啟動(dòng)PC端的服務(wù)程序,最后打開手機(jī)終端的控制程序,進(jìn)入控制頁面。該控制程序在Android 2.3及以上版本手機(jī)上進(jìn)行測(cè)試,全部可以正常使用,具體測(cè)試結(jié)果如表1所示。

表1 測(cè)試結(jié)果

4 結(jié)束語

在數(shù)據(jù)報(bào)Socket數(shù)據(jù)傳輸技術(shù)支撐下,使用C和Java兩種開發(fā)語言共同設(shè)計(jì)實(shí)現(xiàn)了一個(gè)無線控制的屏幕加解鎖程序。該程序既能有效防止用戶正在運(yùn)行的計(jì)算機(jī)被非法使用,又可保證用戶操作的方便性。其設(shè)計(jì)思想及實(shí)現(xiàn)方法將對(duì)逐步完善用戶個(gè)人計(jì)算機(jī)安全性工作起到積極作用。

[1]Richard Stevens W.Advance programming in the UNIX environment[M].New York:Addison Wesley,1992.

[2]孫鑫.VC++深入詳解[M].北京:電子工業(yè)出版社,2006.

[3]魔樂科技軟件實(shí)訓(xùn)中心.Java從入門到精通[M].北京:人民郵電出版社,2010.

[4]金花.鉤子函數(shù)在Windows鍵盤鎖中的應(yīng)用初探[J].福建電腦,2007(4):181-183.

[5]劉雄恩.捕捉和模擬Windows環(huán)境中鼠標(biāo)和鍵盤操作的方法[J].福建農(nóng)業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2003,32(2):256-260.

[6]董曉剛.淺析Android系統(tǒng)的四大基本組件[J].中國電子商務(wù),2013(1):39.

[7]關(guān)晶鑫,李永全.Android中的Activity生命周期[J].電腦知識(shí)與技術(shù),2013(11):2713-2715.

[8]Cowley N.The relevance of intent to human -android strategic interaction and artificial consciousness[J].Robot and Human Interactive Communication,2006(5):480 -485.

猜你喜歡
鉤子控制程序服務(wù)端
基于PLC的變電站備用電源自動(dòng)投入裝置控制程序的研究
誰和誰好
新時(shí)期《移動(dòng)Web服務(wù)端開發(fā)》課程教學(xué)改革的研究
在Windows Server 2008上創(chuàng)建應(yīng)用
幸福的一家
《脈望館鈔校本古今雜劇》穿關(guān)之“鉤子困帶”考
精鉤子
基于PLC數(shù)值處理模塊的PID控制程序研究
紙機(jī)傳動(dòng)控制程序的復(fù)用性研究
建筑工程新工藝、新技術(shù)現(xiàn)澆砼空心板的控制程序
德格县| 八宿县| 东港市| 邯郸市| 长寿区| 鄂托克前旗| 长海县| 宜宾县| 井陉县| 竹溪县| 拉萨市| 博湖县| 左云县| 通许县| 南宁市| 名山县| 嵩明县| 县级市| 达尔| 府谷县| 凉山| 白银市| 墨脱县| 石门县| 鞍山市| 镇巴县| 上蔡县| 罗山县| 新营市| 双峰县| 沧州市| 马山县| 台州市| 宜良县| 阿荣旗| 龙泉市| 内乡县| 柘城县| 武平县| 浮山县| 平陆县|