亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 17.3.2 服務器端程序.txt

?? 網上第一本以TXT格式的VC++深入詳解孫鑫的書.全文全以TXT格式,并每一章節都分了目錄,清晰易讀
?? TXT
字號:
17.3.2 服務器端程序
下面,我們就利用命名管道實現進程間的通信。首先實現服務器端程序,新建一個單文檔類型的 MFC
應用程序,工程取名為: NamedPipeSrv。然后,為該工程增加一個子菜單,名稱為"命名管道"。接
著,為該子菜單添加三個菜單項,并分別為它們添加相應的命令響應函數,本例選擇 
CNamedPipeSrvView類接收這些命令響應函數。各菜單項的 E、名稱,以及響應函數如表 17.13所示。
ID  菜單名稱 響應函數 
IDM_PIPE_CREATE 創建管道  OnPipeCreate  
IDM_PIPE_READ  讀取數據  OnPipeRead  
IDM_PIPE_WRITE  寫入數據  OnPipeWrite  

接下來,為 CNamedPipeSrvView類增加一個句柄變量,用來保存創建的命名管道實例的句柄。 
private: 
HANDLE hPipe; 

在 CNamedPipeSrvView類的構造函數中將其初始化為 NULL: 
CNamedPipeSrvView :: CNamedPipeSrvView () 

// TODO: add construction code here 
hPipe =NULL ; 
然后在 CNamedPipeSrvView類的析構函數中,如果判斷該句柄有值,則調用 CloseHandle函數關閉
該句柄 : 
CNarnedPipeSrvView:: -CNamedPipeSrvView () 
if(hPipe) 
CloseHandle(hPipe) ; 

1.創建命名管道
接下來,在 OnPipeCreate函數中就可以調用 CreateNamedPipe函數創建命名管道了。具體代碼如例 
17-9所示。 
例17-9 , 
void CNamedPipeSrvView : :OnPipeCreate() 
// TODO: Add your cornrnand handler code here 
//創建命名管道 
hPipe=CreateNamedPipe("\\\\ .\\pipe\\MyPipe" , PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED, 
0, 1 , 1024 , 1024 , 0,NULL) ; 
if(INVALID_HANDLE_VALUE==hPipe) 
MessageBox ( "創建命名管道失敗 ! ") ; 
hPipe=NULL ; 
return; 


//創建匿名的人工重置事件對象 
HANDLE hEvent; 
hEvent=CreateEvent(NULL, TRUE , FALSE ,NULL) ; 
if ( !hEvent) 

MessageBox("創建事件對象失敗!"); 
CloseHandle(hPipe); 
hPipe=NULL; 

 
return; 
}
OVERLAPPED ovlap; 
ZeroMemory(&ovlap , sizeof(OVERLAPPED)); 
ovlap.hEvent=hEvent; 

//等待客戶端請求的到來 
if(!ConnectNamedPipe(hPipe, &ovlap)) 
if(ERROR_IO_PENDING!=GetLastError()) 
MessageBox ("等待客戶端連接失敗!"); 
CloseHandle(hPipe) ; 
CloseHandle(hEvent); 
hPipe=NULL; 
return; 

}
 if(WAIT_FAILED==WaitForSingleObject(hEvent , INFINITE) ) { 
MessageBox("等待對象失敗!"); 
CloseHandle(hPipe); 
CloseHandle(hEvent) ; 
hPipe=NULL; 
return; 

CloseHandle(hEvent); 

,如果想要指定兩個反斜杠,那么在代碼中就需要輸入四個反斜杠。

所以,在如例 17-9所示代碼中調用 CreateNamedPipe函數時,將管道的名稱指定為:
"\\.\pipe\hPipe";管道訪問的模式設定為 PIPE_ACCESS_DUPLEX,即雙向模式,服
務器進程和客戶端進程都可以從管道讀取數據和向管道中寫入數據,同時指定 
FILE_FLAG_OVERLAPPED標志,允許重疊方式:第三個參數用來指定管道類型、讀取
和等待方式,本例將其值設為 0,即默認為字節類型和字節讀方式:第四個參數用來指定
管道實例的最大數目,本例設置為1,因為本程序是一個測試程序,只需要一個客戶端連
接就可以了:第五個和第六個參數分別用來指定輸出緩沖區大小和輸入緩沖區大小,本例
都設置為 1024;第七個參數指定超時值,本例設為 0;最后一個參數指定安全屬性,本例
設置為 NULL,讓管道句柄使用默認的安全性。 
如果 CreateNamedPipe函數調用成功,它將返回一個有效的管道句柄;否則返回 
INVALID_HANDLE_VALUE,可以調用 GetLas tError函數獲得更多的錯誤信息。因此在程序中可以對 
CreateNamedPipe函數的返回值進行判斷,如果失敗,則提示用戶:"創建命名管道失敗!",接著,將
管道句柄變量 ChPipe)設置為 NULL,這樣是為了避免程序失敗時在 CNamedPipeSrvView對象的析構
函數中再次調用 CloseHandle函數關閉這個句柄,然后讓 OnPipeCreate函數直接返回:如果成功創
建了命名管道的實例,就可以調用 ConnectNamedPipe函數,等待客戶端請求的到來。這個函數允許
一個服務端進程等待一個客戶端進程連接到一個命名管道的一個實例上。這個函數的命名不太好,
給人的直覺好像去連接服務器端的命名管道,實際上這個函數的作用是讓服務器等待客戶端的連接
請求的到來。該函數聲明如下所示: 
BOOL ConnectNamedPipe(HANDLE hNamedPipe , LPOVERLAPPED lpOverlapped); 

ConnectNamedPipe函數有兩個參數,其含義分別如下所述。 
. hNamedPipe 
指向一個命名管道實例的服務器的句柄,該句柄由 CreateNamedPipe函數返回。 
. lpOverlapped 
指向一個 OVERLAPPED結構的指針,如果 hNamedPipe參數所標識的管道是用 FILE-FLAG-OVERLAPPED
標記打開的,則這個參數不能是 NULL,必須是一個有效的指向一個 OVERLAPPED結構的指針;否則該
函數可能會錯誤地執行。如果hNamedPipe參數所標識的管道是用 FILE-FLAG-OVERLAPPED標記打開
的,并且這個參數不是 NULL,則這個參數所指向的 OVERLAPPED結構體中必須包含人工重置事件對
象句柄。
于是,上述 OnPipeCreate函數調用 CreateEvent的數創建了一個匿名的人工重置事件對象句柄(注
意:第二個參數一定要指定為 TRUE) o CreateEvent函數如果調用失敗,將返回 NULL,所以對該函
數的返回值進行判斷,如果調用失敗,則提示用戶:"創建事件對象失敗!",并在調用 return語句讓 
OnPipeCreate函數返回之前,調用 CloseHandle函數關閉命名管道的句柄,然后將其設置為 NULL,
原因前面已經提過了,主要是為了避免程序關閉時,在 CNamedPipeSrvView對象的析構函數中再次
調用 CloseHandle函數關閉這個句柄。
如果成功創建了匿名的人工重置事件對象,那么接下來就定義一個 OVERLAPPED結構體類型的變量: 
ovlap,雖然程序中片需要使用到該變量的事件對象句柄成員 C hEvent ),但是首先應該將 ovlap
變量中所有成員都設置為 0,以免它們影響函數運行的結果,然后將 hEvent成員設置為剛剛創建的
一個有效的人工重置事件對象句柄。
接著就可以調用 Connec tN amedPipe函數等待客戶端請求的到來,該函數的第一個參數就是前面調
用 CreateNamedPipe函數返回的一個有效的命名管道句柄,第二個參數就是指向 OVERLAPPED結構體
變量的指針,即 ovlap變量的地址。
如果 ConnectNamedPipe函數調用失敗,它將返回 O值,但其中有一種特殊情況并不表明等待連接事
件失敗了,也就是說,如果這時調用 GetLastError函數返回 ERROR_ 
IO_PENDING.那么并不表示 ConnectNamedPipe函數失敗了,只是表明這個操作是一個未決的操作,
在隨后的某個時間這個操作可能能夠完成。因此在程序中,當 ConnectNamedPipe函數返回 O時,還
應調用 GetLastError函數,并對其返回值進行判斷,如果不是 ERROR_IO_PENDING.才說明 
ConnectNamedPipe函數調用失敗,這時提示用戶:"等待客戶端連接失敗!",然后調用 CloseHandle
函數分別關閉管道句柄和事件對象句柄,井將管道句柄設置為 NULL.之后調用 retum語句返回。
如果上述操作都成功了,那么這時調用 WaitForSingleObject函數等待事件對象 (hEvent)變為有信
號狀態。讀者應注意,前面我們己將該事件對象句柄賦給了。vlap變量的hEvent成員,也就是說,
這兩個變量: hEvent和 ovlap.hEvent.現在標識的是同一個對象,因此在調用 
WaitForSingleObject函數時,采用這兩個對象中的任一個都是可以的。本例將 
WaitForSingleObject函數的第二個參數設置為 INFINITE,即讓線程永遠等待,直到所等待的事件
對象變為有信號狀態。
同樣的,應該對 WaitForSingleObject函數的返回值進行判斷,如果調用失敗,則提示用戶"等待事
件對象失敗!",然后關閉相關的句柄,并將管道旬柄設置為 NULL.之后調用 retum語句返回。
最后,當請求到所等待的事件對象后,也就是當該事件對象變成有信號狀態時,說明已經有一個客
戶端連接到命名管道的實例上了。這時,不再需要該事件對象句柄了,可以調用 CloseHandle函數
將它關閉。 
2.讀


對于命名管道的數據讀取操作,與上面匿名管道的讀取操作是一樣的,因此可以直接復制己實現的
代碼,然后將 ReadFile函數的第一個參數修改為本例創建的命名管道的句柄即可,結果如例 17-10
所示。
例 17-10 

void CNamedPipeSrvView: :OnPipeRead() 
( 
// TODO: Add your command handler code here 
char buf [1 00] ; 
DWORD dwRead; 
if(!ReadFile(hPipe, buf , 100 , &dwRead,NULL)) 

MessageBox ( "讀取數據失敗!"); 
return; 

MessageBox(buf); 
3.寫入數據
對于命名管道的數據寫入操作,與上面匿名管道的寫入操作是一樣的,所以可以直接復制己實現的
代碼,然后將 WriteFi1e函數的第一個參數修改為本例創建的命名管道的句柄

即可,結果如例 17-11所示。 
1?IJ 17-11 
void CNarnedPipeSrvView: :OnPipeWrite() 
11 TODO : Add your cornrnand handler code here 
char buf [1 = ''http ://www . sunxin. org" ; 
DWORD dwWrite; 
if(!WriteFile(hPipe, buf, strlen(buf ) +1, &dwWrite, NULL) ) 

MessageBox ( "寫入數據失敗!"); 
return; 

至此我們就完成了利用命名管道實現進程間通信的服務器端程序,利用 Build命令生成 
NamedPipeSrv程序。 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
伊人一区二区三区| 国产精品中文字幕一区二区三区| 日韩在线一二三区| 波多野结衣中文字幕一区| 欧美日韩国产免费| 日韩码欧中文字| 国产高清不卡二三区| 555夜色666亚洲国产免| 成人欧美一区二区三区白人| 狠狠久久亚洲欧美| 欧美猛男男办公室激情| 中文字幕在线一区免费| 国产精品456露脸| 制服丝袜中文字幕亚洲| 亚洲精品国产品国语在线app| 国产精品一区二区在线播放| 日韩一区和二区| 午夜欧美电影在线观看| 一本久久a久久免费精品不卡| 国产午夜亚洲精品午夜鲁丝片| 日韩精品亚洲一区二区三区免费| 91美女在线观看| 国产精品久线观看视频| 粉嫩高潮美女一区二区三区| 精品国产电影一区二区| 麻豆精品视频在线观看| 制服丝袜国产精品| 婷婷综合另类小说色区| 欧美日韩精品三区| 五月天中文字幕一区二区| 欧美影院一区二区三区| 亚洲综合在线视频| 91福利社在线观看| 一区二区三区国产精品| 欧美午夜精品免费| 亚洲成av人**亚洲成av**| 欧美亚洲一区二区在线| 亚洲国产精品综合小说图片区| 91成人在线观看喷潮| 亚洲一区二区3| 欧美肥大bbwbbw高潮| 婷婷六月综合网| 欧美大片在线观看一区| 久久不见久久见免费视频1| 精品成人a区在线观看| 国产伦精品一区二区三区免费 | 欧美aaaaaa午夜精品| 91精品综合久久久久久| 蜜臀精品久久久久久蜜臀| 精品久久久久久亚洲综合网 | 色综合天天性综合| 亚洲丝袜另类动漫二区| 在线亚洲人成电影网站色www| 一区二区三区免费在线观看| 欧美私模裸体表演在线观看| 日本欧美加勒比视频| 久久亚洲欧美国产精品乐播| 9l国产精品久久久久麻豆| 亚洲最新在线观看| 日韩精品一区二区三区四区| 高清在线观看日韩| 亚洲丰满少妇videoshd| 欧美xxxx老人做受| 国内精品久久久久影院薰衣草 | 欧美精品日韩精品| 久久精品国产亚洲a| 久久精品网站免费观看| proumb性欧美在线观看| 亚洲午夜电影网| wwww国产精品欧美| 色呦呦国产精品| 九九视频精品免费| 樱花草国产18久久久久| 精品国产伦理网| 欧美亚洲高清一区| 国产大陆精品国产| 亚洲h在线观看| 国产精品青草综合久久久久99| 欧美男同性恋视频网站| 岛国精品在线观看| 天天免费综合色| 亚洲视频精选在线| 日韩女同互慰一区二区| 一本一道综合狠狠老| 国产麻豆91精品| 日韩一区精品字幕| 一区二区三区资源| 国产精品免费视频网站| 日韩欧美国产综合一区| 欧美最猛性xxxxx直播| 成人性生交大片免费看中文网站| 午夜激情综合网| 亚洲欧美日韩久久| 国产人久久人人人人爽| 欧美大尺度电影在线| 欧美三级一区二区| 92国产精品观看| 粉嫩蜜臀av国产精品网站| 狠狠久久亚洲欧美| 久久99国产乱子伦精品免费| 亚洲va欧美va人人爽| 亚洲免费大片在线观看| 国产精品久久久久久亚洲伦 | 亚洲免费伊人电影| 国产亚洲女人久久久久毛片| ww久久中文字幕| 欧美精品v日韩精品v韩国精品v| 99久久精品一区二区| 丰满亚洲少妇av| 国产成人午夜视频| 成人小视频免费在线观看| 国产高清久久久久| 国产成a人无v码亚洲福利| 国产精品中文字幕欧美| 国产一区二区三区四区五区美女| 久久精品噜噜噜成人av农村| 免费精品99久久国产综合精品| 日韩—二三区免费观看av| 日韩av在线发布| 麻豆精品在线播放| 国产一区二区三区视频在线播放| 九九九精品视频| 国产一区二区三区四区五区美女| 国产精品一线二线三线精华| 国产一区二区剧情av在线| 国产成人鲁色资源国产91色综 | 国产伦精品一区二区三区视频青涩 | 亚洲精品乱码久久久久久久久 | 精品欧美久久久| 欧美zozo另类异族| 国产婷婷色一区二区三区| 欧美激情中文字幕一区二区| 亚洲色图制服丝袜| 亚洲高清视频中文字幕| 免费在线观看成人| 国产高清精品久久久久| 91美女精品福利| 欧美日高清视频| 久久免费精品国产久精品久久久久 | 色94色欧美sute亚洲线路一ni| 色婷婷av一区二区三区之一色屋| 欧美日本一区二区| 久久综合网色—综合色88| 国产日本一区二区| 亚洲一区二区三区四区五区黄| 日本视频免费一区| 不卡视频在线观看| 欧美日韩精品一区二区三区 | 欧美一区欧美二区| 亚洲精品一区二区三区香蕉| 国产精品欧美综合在线| 亚洲国产日韩综合久久精品| 久久99精品久久久久久国产越南| 99v久久综合狠狠综合久久| 欧美日韩中文字幕一区| 精品国产91乱码一区二区三区| 国产精品久久久久影视| 另类成人小视频在线| 成人高清视频在线| 欧美精品久久99久久在免费线| 国产无遮挡一区二区三区毛片日本| 一区二区三区日本| 国产福利精品导航| 4hu四虎永久在线影院成人| 国产精品美女久久久久高潮| 日本不卡在线视频| 91丨九色丨蝌蚪丨老版| 久久婷婷久久一区二区三区| 亚洲成人中文在线| 97se亚洲国产综合自在线观| 亚洲精品在线一区二区| 亚洲五月六月丁香激情| 99精品欧美一区| 久久网这里都是精品| 免费在线一区观看| 欧美日韩国产美女| 一区二区欧美在线观看| 99久久免费国产| 国产视频911| 韩国欧美国产一区| 日韩一区和二区| 视频一区国产视频| 欧美性大战久久久久久久 | 亚欧色一区w666天堂| av一区二区三区四区| 国产日本亚洲高清| 国产在线视视频有精品| 欧美一区二区三区日韩视频| 午夜精品久久久久久久蜜桃app| 91香蕉国产在线观看软件| 中文字幕第一区| 国产成人亚洲综合色影视 | 国产精品毛片久久久久久久| 日本欧美一区二区三区| 欧美人狂配大交3d怪物一区| 夜夜爽夜夜爽精品视频| 欧美在线高清视频| 亚洲国产精品影院| 欧美日韩一本到| 午夜成人免费电影|