無論是
sql server
的使用者,還是
pb的使用者,作為
c/s結構開發環境,他們在網路通訊的
實現上,都有一種共同的方法
__命名管道。由於當前作業系統的不惟一性,各個系統
都有其獨自的通訊協議,導致了不同系統間通訊的困難。儘管
tcp/ip
協議目前已發展成
為internet
的標準,但仍不能保證
c/s應用程式的順利進行。命名管道作為一種通訊方
法,有其獨特的優越性,這主要表現在它不完全依賴於某一種協議,而是適用於任何
協議__
只要能夠實現通訊。
命名管道具有很好的使用靈活性,表現在:
1) 既可用於本地,又可用於網路。
2) 可以通過它的名稱而被引用。
3) 支援多客戶機連線。
4) 支援雙向通訊
。5)
支援非同步重疊
i/o操作。
不過,當前只有
windows nt
支援服務端的命名管道技術。
一、命名管道程式設計的實現
1.命名管道
server
和client
間通訊的實現流程
(1)建立連線:服務端通過函式
createnamedpipe
建立乙個命名管道的例項並返回用於
今後操作的控制代碼,或為已存在的管道建立新的例項。如果在已定義超時值變為零以前,有
乙個例項管道可以使用,則建立成功並返回管道控制代碼,並用以偵聽來自客戶端的連線請求,
該功能通過
connectnamedpipe
函式實現。
另一方面,客戶端通過函式
waitnamedpipe
使服務程序等待來自客戶的例項連線,如
果在超時值變為零以前,有乙個管道可以為連線使用,則
waitnamedpipe
將返回true
,並通過呼叫
createfile
或callnamedpipe
來呼叫對服務端的連
接。此時服務端將接受客戶端
的連線請求,成功建立連線,服務端
connectnamedpipe
返回true
,客戶端
createfile
將返回一指向管道檔案的控制代碼。
從時序上講,首先是客戶端通過
waitnamedpipe
使服務端的
createfile
在限時時間內
建立例項成功,然後雙方通過
connectnamedpipe
和createfile
成功連線,並返回用以通訊
的檔案控制代碼,此時雙方即可進行通訊。
(2)通訊實現:建立連線之後,客戶端與伺服器端即可通過
readfile
和writefile
,利用得到的管道檔案控制代碼,彼此間進行資訊交換。
(3)連線終止:當客戶端與服務端的通訊結束,或由於某種原因一方需要斷開時,客
戶端應呼叫
closefile
,而服務端應接著呼叫
disconnectnamedpipe
。當然服務端亦可通
過單方面呼叫
disconnectnamedpipe
終止連線。最後應呼叫函式
closehandle
來關閉該管道。
2.命名管道伺服器端和客戶端**實現
(1)客戶端:
handle clthandle
;char pipenamestr[30];
sprintf(pipenamestr,」\\\\servername\\pipe\\pipename」)
if (waitnamedpipe( pipenamestr, nmpwait_wait_forever)==false
// 管道名要遵循
unc,格式為
\ \.
\pipe\pipname,
名字不分大小寫。
afxmessagebox(「
操作失敗,請確定服務端正確建立管道例項!
」);else
clthandle=createfile(pipenamestr, generic_read|generic_write,
file_share_read| file_share_write,null, open_existing,
//為了與命名管道連線,此引數應一直為
open_existing
file_attribute_archive|file_flag_write_through,
// file_flag_write_through
會使管道
writefile
呼叫處於阻塞狀態,直到資料傳送成功。
null);
if (clthandle== invalid_handle_value)
afxmessagebox(「
管道連線失敗
」);else
douserttransactinfo
();//
執行使用者自定義資訊交換函式
__從管道讀、寫資訊。
……(2)
服務端:
handle svrhandle
;char pipenamestr[30];
sprintf(pipenamestr,」\\\\.\\pipe\\pipename」)
svrhandle=createnamedpipe(pipenamestr,
pipe_access_duplex|file_flag_write_through,
//阻塞模式,這種模式僅對
」位元組傳輸管道
」操作有效。
file_wait|pipe_type_byte,
//位元組模式
pipe_unlimited_instances,
128,128,
null,null);
// security_attributes
結構指標,描述乙個新管道,確定子程序的繼承權,如果為
null
則該命名管道不能被繼承。
if (svrhandle==invalid_handle_value)
afxmessagebox(「
管道建立失敗,請確定客戶端提供連線可能!
」);else
if (connectnamedpipe(svrhandle,null)==false)
afxmessagebox(「
建立連線失敗!
」);else
douserttransactinfo
();//
使用者自定義資訊交換函式
……二、程式設計的注意事項
1.如果命名管道客戶端已開啟,函式將會強迫關閉管道,用
disconnectnamedpipe
關閉的管道,其客戶端還必須用
closehandle
來關閉最後的管道。
2. readfile
和writefile
的hfile
控制代碼是由
createfile
及connectnamedpipe
返回得到。
3.乙個已被某客戶端連線的管道控制代碼在被另一客戶通過
connectnamedpipe
建立連線之前,服務端必須用
disconnectnamedpipe
函式對已存在的連線進行強行拆離。服務端拆離管道會造成管道中資料的丟失,用
flushfilebuffers
函式可以保證資料不被丟失。
4.命名管道服務端可以通過新建立的管道控制代碼或已被連線過其他客戶的管道句
柄來使用
connectnamedpipe
函式,但在連線新的客戶端之前,服務端必須用函式
disconnectnamedpipe
切斷之前的客戶控制代碼,否則
connectnamedpipe
將會返回
false。5.
阻塞模式,這種模式僅對「位元組傳輸管道
"操作有效,並且要求客戶端與服務端不
在同一機器上。如果用這種模式,則只有當函式通過網路向遠端計算機管道緩衝器寫數
據成功時,才能有效返回。如果不用這種模式,系統會執行預設方式以提高網路的工作效率。
6.使用者必須用
file_create_pipe_instance
來訪問命名管道物件。新的命名管
道建立後,來自安全引數的訪問控制列表定義了訪問該命名管道的許可權。所有命名管道
例項必須使用統一的管道傳輸方式、管道模式等引數。客戶端未啟動,管道服務端不能
執行阻塞讀操作,否則會發生空等的阻塞狀態。當最後的命名管道例項的最後乙個控制代碼
被關閉時,就應該刪除該命名管道。
VC命名管道通訊的實現
無論是 sql server 的使用者,還是 pb的使用者,作為 c s結構開發環境,他們在網路通訊的 實現上,都有一種共同的方法 命名管道。由於當前作業系統的不惟一性,各個系統 都有其獨自的通訊協議,導致了不同系統間通訊的困難。儘管 tcp ip 協議目前已發展成 為 internet 的標準,但...
命名管道實現程序間通訊
include include include include include include include define fifo server tmp myfifo main int argc,char argv argc 引數個數?argv 引數 else printf write s to...
程序通訊 命名管道
handle winapi createnamedpipe in lpctstr lpname,名稱 必須為 pipe pipename格式,表示本地主機,如需聯網,就用主機名 in dword dwopenmode,開啟方式這裡用雙工pipe access duplex in dword dwpi...