版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、第11章 進程間通信,主要內(nèi)容: 進程間通信的基本概念和原理; 幾種典型的進程間通信的方法:剪切板、窗口消息、消息隊列、Sockets等。 編程模式和編程原理。,11.1 進程間通信,11.1.1 進程間通信的基本概念,程序是為了完成某項任務(wù)編排的語句序列,它告訴計算機如何執(zhí)行,因此程序是需要運行的。 進程能描述程序的執(zhí)行過程而且可以作為共享資源的基本單位。 兩個不同進程可以通過互相發(fā)送消息進行合作,消息是通過消息緩沖而在進程間相互傳遞的。 所謂進程通信是指進程之間可直接以較高的效率傳遞較多數(shù)據(jù)的信息交換方式。這種方式中采用的是通信機構(gòu),如消息發(fā)送和消息接收、郵箱結(jié)構(gòu)等,在進程通信時往往以信件
2、形式(或稱消息)傳遞信息。,所謂信件是指進程之間相互傳遞的賴以發(fā)生交互作用的有結(jié)構(gòu)的數(shù)據(jù)。 進程通信的一般模型,系統(tǒng)中的每個進程都可以使用發(fā)送/接受系統(tǒng)調(diào)用向其他進程發(fā)送消息以及接收來自別的進程的消息。 操作系統(tǒng)除了提供發(fā)送/接收倆個系統(tǒng)調(diào)用之外,主要的任務(wù)是完成消息的管理與傳遞。 消息管理的功能包括:消息打包與分解,消息隊列管理,發(fā)送/接收機構(gòu)管理。 信道指報文經(jīng)歷的通路,其具體的物理實現(xiàn)可能是共享的主存區(qū)域或者外存盤塊,也可能是總線或電纜。,11.1.2 Windows下進程間的通信機制,IPC機制:Microsoft的API提供了應(yīng)用程序之間的通信和數(shù)據(jù)共享機制,稱為進程間通信。 進行通
3、信的應(yīng)用程序可分為服務(wù)器和客戶. 客戶:向其他進程發(fā)出請求的應(yīng)用或進程 服務(wù)器:響應(yīng)客戶請求的應(yīng)用進程,可選擇的IPC機制:,11.2 窗口消息,窗口消息:一個應(yīng)用用WM_COPYDATA消息向另一個應(yīng)用發(fā)送數(shù)據(jù),接收數(shù)據(jù)的應(yīng)用從COPYDATASTRUCT結(jié)構(gòu)中取數(shù)據(jù) 窗口消息的實現(xiàn)需要得到接收方窗口的句柄,使用SendMessage向該進程發(fā)送消息。在發(fā)送方,用FindWindow找到接收方句柄,然后向接收方發(fā)送WM_COPYDATA消息 句柄:概念在WINDOWS編程中是一個很重要的概念,在許多地方都扮演著重要的角色。,在Windows環(huán)境中,句柄是用來標(biāo)識項目的, WINDOWS程序中
4、并不是用物理地址來標(biāo)識一個內(nèi)存塊,文件,任務(wù)或動態(tài)裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過句柄來進行操作。句柄是一個標(biāo)識符,是拿來標(biāo)識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數(shù)據(jù)類型上來看它只是一個16位的無符號整數(shù)。應(yīng)用程序幾乎總是通過調(diào)用一個WINDOWS函數(shù)來獲得一個句柄,之后其他的WINDOWS函數(shù)就可以使用該句柄,以引用相應(yīng)的對象。 在WINDOWS編程中會用到大量的句柄,比如:HINSTANCE(實例句柄),HBITMAP(位圖句柄),HDC(設(shè)備
5、 描述表句柄),HICON(圖標(biāo)句柄)等等。,11.2.1 COPYDATASTRUCT結(jié)構(gòu),COPYDATASTRUCT結(jié)構(gòu)包含通過WM_COPYDATA消息傳遞到另一個應(yīng)用的數(shù)據(jù),其定義如下: typedef struct tagCOPYDATASTRUCT DWORD dwData; DWORD cbData; PVOID lpData; COPYDATASTRUCT, *PCOPYDATASTRUCT; dwData:指定傳遞到接收消息的應(yīng)用的數(shù)據(jù) cbData:指定成員lpData指向的數(shù)據(jù)的字節(jié)數(shù) lpData:指向傳遞到接收消息的應(yīng)用的數(shù)據(jù)的指針。,一個應(yīng)用發(fā)送WM_COPYDA
6、TA消息傳遞數(shù)據(jù)到另一個應(yīng)用,若發(fā)送該消息,以下列參數(shù)調(diào)用SendMessage函數(shù) DllImport(User32.dll,EntryPoint=SendMessage) private static extern int SendMessage( int hWnd, / handle to destination window int Msg, / message int wParam, / first message parameter ref COPYDATASTRUCT lParam / second message parameter ); /使用extern 修飾符意味著方法在
7、C# 代碼的外部實現(xiàn),20.2.2 WM_COPYDATA消息,wParam:發(fā)送數(shù)據(jù)的窗口句柄。 lParam是指向含有發(fā)送數(shù)據(jù)的COPYDATASTRUCT結(jié)構(gòu)的指針。其返回值為布爾型,當(dāng)接收消息的應(yīng)用處理了該數(shù)據(jù),返回true,否則返回false 發(fā)送WM_COPYDATA消息時,SendMessage函數(shù)申請到一個大小為cbData字節(jié)的內(nèi)存塊,并將數(shù)據(jù)從調(diào)用者的地址空間復(fù)制到該內(nèi)存塊中,然后向目標(biāo)窗口發(fā)送該消息。接收消息的應(yīng)用的窗口處理函數(shù)處理該消息時,lParam參數(shù)是一個指向接收消息的應(yīng)用的地址空間中的COPYDATASTRUCT結(jié)構(gòu)的指針,lpData成員是指向一個復(fù)制內(nèi)存塊的
8、指針,該地址反映了該內(nèi)存塊在接收消息的應(yīng)用的地址空間的位置。,一個應(yīng)用可以用WM_COPYDATA消息向另一個應(yīng)用發(fā)送數(shù)據(jù),接收數(shù)據(jù)的應(yīng)用從COPYDATASTRUCT結(jié)構(gòu)中取數(shù)據(jù),可以將發(fā)送數(shù)據(jù)的應(yīng)用視為服務(wù)器,接收數(shù)據(jù)的應(yīng)用視為客戶,一個應(yīng)用可以同時既為服務(wù)器又為客戶。窗口消息的程序框圖 如下:,11.2.3 實例程序,使用WM_COPYDATA消息有個前提,直到接收消息進程的句柄,這是實現(xiàn)通信的關(guān)鍵。得到接收窗口句柄最直接的方法,就是FindWindow()函數(shù),找窗口類或者窗口名。 例如:在發(fā)送方,程序中通過 int WINDOW_HANDLER = FindWindow(null,
9、“接收方窗體”);語句獲得窗體句柄。 得到接收方窗體的句柄后,使用SendMessage()函數(shù)應(yīng)向該進程發(fā)送WM_COPYDATA消息。 SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds);,源代碼: private void button1_Click(object sender, System.EventArgs e) /在發(fā)送方,用FindWindow找到接受方的句柄,然后向接受方發(fā)送WM_COPYDATA消息. /接受方在DefWndProc事件中,來處理這條消息. int WINDOW_HANDLER = FindWindow(
10、null, 接收方窗體); if (WINDOW_HANDLER = 0) else byte sarr = System.Text.Encoding.Default.GetBytes(this.textBox1.Text); int len = sarr.Length; COPYDATASTRUCT cds; cds.dwData = (IntPtr)100; cds.lpData = this.textBox1.Text; cds.cbData = len + 1; SendMessage(WINDOW_HANDLER, WM_COPYDATA, 0, ref cds); ,其中: 添加如
11、下定義: const int WM_COPYDATA = 0 x004A; DllImport(User32.dll, EntryPoint = SendMessage) private static extern int SendMessage( int hWnd, / handle to destination window int Msg, / message int wParam, / first message parameter ref COPYDATASTRUCT lParam / second message parameter ); /使用extern 修飾符意味著方法在C#
12、 代碼的外部實現(xiàn) DllImport(User32.dll, EntryPoint = FindWindow) private static extern int FindWindow(string lpClassName, string lpWindowName);,public struct COPYDATASTRUCT public IntPtr dwData; public int cbData; MarshalAs(UnmanagedType.LPStr) public string lpData; /UnmanagedType,指定如何將參數(shù)或字段封送到非托管代碼。 /LPStr,
13、單字節(jié)、空終止的ANSI 字符串??稍赟ystem.String 或System.Text.StringBuilder 數(shù)據(jù)類型上使用此成員。 ,接收方數(shù)據(jù):重寫窗體的DefWndProc()過程來接收自定義的消息: protected override void DefWndProc(ref System.Windows.Forms.Message m) switch (m.Msg) case WM_COPYDATA: string now = DateTime.Now.ToShortTimeString(); count+; COPYDATASTRUCT mystr = new COPYD
14、ATASTRUCT(); Type mytype = mystr.GetType(); mystr = (COPYDATASTRUCT)m.GetLParam(mytype); this.listBox1.Items.Add(now + : + mystr.lpData + 收到的第 + count + 條信息); break; default: base.DefWndProc(ref m); break; ,11.3 消息隊列,利用MSMQ,可以 消息的程序框圖,安裝Message Queuing Services,通過控制面板手工創(chuàng)建,控制面板-添加/刪除程序-添加/刪除Windows組建
15、-消息隊列服務(wù)安裝MSMQ。接著要配置MSMQ,方法是打開服務(wù)器資源管理器-本機機器名-消息隊列-專用隊列-創(chuàng)建有名的隊列(例如,隊列名為aaa,是程序所需要的)。,通過程序方式創(chuàng)建,if (MessageQueue.Exists(.Private$aaa) MyMQ = new MessageQueue(.Private$aaa); else MyMQ = MessageQueue.Create(.Private$aaa);,發(fā)送數(shù)據(jù): temp = this.textBox1.Text.ToString(); MyMQ.Send(temp +(窗體A第+ iCount.ToString()
16、+條消息);/將消息放入隊列 接收數(shù)據(jù): m = MyMQ.Receive(new TimeSpan(0, 0, 1);/從隊列中提取消息 str = m.Body.ToString();,11.4 Windows Sockets編程,套接字是網(wǎng)絡(luò)通信的基本操作單元,它提供了不同主機間進程雙向通信的通典,這些進程在通信前各自建立一個Socket,并通過Socket的讀寫操作實現(xiàn)網(wǎng)絡(luò)通信功能 11.4.1 Sockets簡介,一個特殊的通信域,例如一個網(wǎng)絡(luò)連接或者一個進程間通信管道; 一個特殊的通信類型,例如流或數(shù)據(jù)報; 一個特殊的協(xié)議,例如TCP(Transport Control Proto
17、col,傳輸控制協(xié)議)或UDP(User Datagram Protocol,用戶報文協(xié)議)。,Socket的定義如下:,字節(jié)流Socket:這是最常用的Socket類型,TCP/IP協(xié)議簇中的TCP協(xié)議使用此類接口,它提供面向連接的(建立虛電路)、無差錯的、發(fā)送先后順序一致的、包長度不限和非重復(fù)的網(wǎng)絡(luò)信包傳輸。 數(shù)據(jù)報Socket:TCP/IP協(xié)議族中的UDP協(xié)議使用此類接口,它是無連接的服務(wù),以獨立的信包進行網(wǎng)絡(luò)傳輸,信包最大長度為32KB,傳輸不保證順序性、可靠性和無重復(fù)性,它通常用于單個報文傳輸或可靠性不重要的場合。 原始數(shù)據(jù)報Socket:提供對網(wǎng)絡(luò)下層通訊協(xié)議(如IP協(xié)議)的直接訪
18、問,一般不是提供給普通用戶的,主要用于開發(fā)新的協(xié)議或用于提取協(xié)議較隱蔽的功能。,套接字分類:,11.4.2 面向連接的Sockets編程,在傳輸數(shù)據(jù)前建立連接。接收段需要在監(jiān)聽狀態(tài)才能接收到發(fā)送端的請求信息,否則發(fā)送端的連接請求被拒絕。,實現(xiàn)Socket TCP通信,主要用到了C#中的Socket類,使用方法為:Connect、Send、ReceiveFrom等。 Connect:建立與主機的連接 Send:將數(shù)據(jù)發(fā)送到連接的Socket Receive:將數(shù)據(jù)包接收到數(shù)據(jù)緩沖區(qū)并存儲終結(jié)點,返回收到的字節(jié)數(shù) 發(fā)送方,程序步驟: 1、定義偵聽端口號,如port=8000 2、定義對服務(wù)器端的T
19、CP連接 3、定義發(fā)送數(shù)據(jù)的Socket int port = 8000 ; /定義偵聽端口號 private TcpClient tcpc ; /對服務(wù)器端創(chuàng)建TCP連接 private Socket stSend ; /創(chuàng)建發(fā)送數(shù)據(jù)套接字 private bool tcpConnect = false ;,判斷是否和遠(yuǎn)程終結(jié)點成功連接 private void button1_Click(object sender, System.EventArgs e) try stSend = new Socket ( AddressFamily.InterNetwork , SocketType.S
20、tream , ProtocolType.Tcp ) ; /初始化一個Socket實例 IPEndPoint tempRemoteIP = new IPEndPoint ( IPAddress.Parse ( textBox1.Text ) , port ) ; /根據(jù)IP地址和端口號創(chuàng)建遠(yuǎn)程終結(jié)點 EndPoint epTemp = ( EndPoint ) tempRemoteIP ; stSend.Connect ( epTemp ) ; /連接遠(yuǎn)程主機的端口號 statusBar1.Text = 成功連接遠(yuǎn)程計算機! ; tcpConnect = true ; button1.Enab
21、led = false ; button2.Enabled = true ; catch ( Exception ) statusBar1.Text = 目標(biāo)計算機拒絕連接請求! ; ,發(fā)送數(shù)據(jù): int iLength = textBox2.Text.Length ; /獲取要發(fā)送的數(shù)據(jù)的長度 Byte bySend = new byte iLength ; /根據(jù)獲取的長度定義一個Byte類型數(shù)組 bySend = System.Text.Encoding.Default.GetBytes ( textBox2.Text ) ; /按照指定編碼類型把字符串指定到指定的Byte數(shù)組 int
22、i = stSend.Send ( bySend ) ; /發(fā)送數(shù)據(jù) listBox1.Items.Add ( textBox2.Text ),接收端: using System.Net.Sockets ; /使用到TcpListen類 using System.Net ; using System.Threading ; /使用到線程 int port = 8000 ; /定義偵聽端口號 private Thread thThreadRead ; /創(chuàng)建線程,用以偵聽端口號,接收信息 private bool blistener = true ; /設(shè)定標(biāo)示位,判斷偵聽狀態(tài) private
23、Socket stRead ; private TcpListener tlTcpListen; 偵聽客戶端的連接,并接收數(shù)據(jù): try IPAddress ipAddress = Dns.Resolve(localhost).AddressList0; tlTcpListen = new TcpListener(ipAddress, port); /以端口號來初始化TcpListener實例 tlTcpListen.Start ( ) ; /開始監(jiān)聽網(wǎng)絡(luò)的連接請求 statusBar1.Text = 正在監(jiān)聽. ; stRead = tlTcpListen.AcceptSocket ( )
24、; /通過連接請求,并獲得接收數(shù)據(jù)時使用的Socket實例,EndPoint tempRemoteEP = stRead.RemoteEndPoint ; IPEndPoint tempRemoteIP = ( IPEndPoint ) tempRemoteEP ; statusBar1.Text = 已經(jīng)連接! ; /循環(huán)偵聽 while ( blistener ) string sTime = DateTime.Now.ToShortTimeString ( ) ; /獲取接收數(shù)據(jù)時的時間 Byte byRead =new Byte 800 ; int iRead = stRead.ReceiveFrom ( byRead , ref tempRemoteEP ) ; /獲得接收的字節(jié)數(shù)目 Byte byText = new Byte iRead ; /并根據(jù)接收到的字節(jié)數(shù)目來定義字節(jié)數(shù)組 Array.Copy ( byRead , 0 , byText , 0 , iRead ) ; string sTemp = System.Text.Encoding.Default. GetString ( byTex
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年IT運維管理面試題庫從初級到高級
- 2026年IT運維技術(shù)工程師面試技巧及答案
- 2026年項目管理師面試常見問題及答案
- 四川部分學(xué)校2025-2026學(xué)年高三12月月考語文試題及參考答案
- 2025年葫蘆島市建昌縣宣傳部及社會工作部所屬事業(yè)單位公開招聘高層次人才9人備考題庫及完整答案詳解
- 未來五年大黃米企業(yè)縣域市場拓展與下沉戰(zhàn)略分析研究報告
- 2026中國中煤黨校公開招聘8人備考題庫及答案詳解一套
- 2025廣東佛山市順德區(qū)沙滘初級中學(xué)第二學(xué)期臨聘教師招聘備考題庫及答案詳解(新)
- 煤礦班組安全技能大賽運輸班組競賽理論題庫(含答案)
- 2026新疆博爾塔拉州博樂市農(nóng)佳樂農(nóng)業(yè)科技有限公司招聘4人備考題庫及1套參考答案詳解
- 呼吸機相關(guān)肺炎預(yù)防策略指南2026
- 2026年內(nèi)蒙古白音華鋁電有限公司招聘備考題庫帶答案詳解
- 2025年玉溪市市直事業(yè)單位選調(diào)工作人員考試筆試試題(含答案)
- 2026年游戲AB測試實施方法含答案
- 2025湖南湘西鶴盛原煙發(fā)展有限責(zé)任公司招聘擬錄用人員筆試歷年備考題庫附帶答案詳解
- 江蘇省2025年普通高中學(xué)業(yè)水平合格性考試英語試卷(含答案)
- 枕骨骨折的護理課件
- TCEC電力行業(yè)數(shù)據(jù)分類分級規(guī)范-2024
- GB/T 26951-2025焊縫無損檢測磁粉檢測
- 2025及未來5-10年高壓管匯項目投資價值市場數(shù)據(jù)分析報告
- 腹部手術(shù)圍手術(shù)期疼痛管理指南(2025版)課件
評論
0/150
提交評論