進程間通訊的幾種方式

進程間通訊的方法:服務器

  1. 共享內存:

Win32Api容許多個進程訪問同一個映射對象,獲取該映射對象的指針進行操做,這樣就實現了不一樣進程間數據共享網絡

  1. 首先建立內存映射文件,使用CreateFile()建立用於共享內存的文件
  2. 建立內存映射對象,利用CreateFile生成的句柄,調用CreateFileMapping函數,建立內存映射對象,用於獲取映射內存的操做句柄,進程建通信時,須要建立有名映射對象
  3. 創建映射視圖文件,將生成的內存映射對象句柄轉化爲可直接操做的指針,該指針爲共享內存的起始地址,也是邏輯頁中起始頁首地址
  4. 在另外一個進程中使用該共享內存時,須要調用OpenFileMapping接口,獲取有名共享內存的句柄
  5. 使用映射視圖文件獲取該共享內存的邏輯頁首地址,可操做該指針(讀寫)
  6. 使用完成後,須要釋放映射進入進程的內存,調用UnmapViewOfFile接口,釋放內存
  7. 使用消息WM_COPYDATA 底層實現爲內存映射

WM_COPYDATA使用很是便利,當一個進程向另外一個進程發送消息時,只須要調用SendMessage或者PostMessage便可,消息使用條件爲,須要獲取目標進程的主窗口句柄app

實現方法:socket

  1. 首先建立消息響應的聲明和實現

BEGIN_MESSAGE_MAP(CMainFram*,CFrameWndEx*)函數

ON_WN_COPYDATA()學習

END_MESSAGE_MAP()spa

BOOL OnCopyData(CWnd*,COPYDATASTRUCT*);操作系統

BOOL OnCopyData(CWnd*pWnd,COPYDATASTRUCT*pCopyDataStruct)線程

{指針

return CMainFrame::OnCopyData(pWnd,pCopyDataStruct);

}

  1. 數據發送方首先獲取目標進程的句柄

HANDLE hHandle = FindWindow(NULL,「**」);

調用SendMessage或者PostMessage發送數據

SendMessage(hHandle,WM_COPYDATA,LPVOID,LPVOID);

3.普通消息

1.建立消息的聲明和實現

#define MYMESSAGE USER+100

BEGIN_MESSAGE_MAP(CMainFram*,CFrameWndEx*)

ON_MESSAGE(MYMESSAGE,OnMyMessage)

END_MESSAGE_MAP()

LRESULT OnMyMessage(DWORD,DWORD);

LRESULT OnMyMessage(DWORD,DWORD)
{

Return 0;

}

2.發送方

先查找目標窗口的句柄

#define MYMESSAGE USER+100

HANDLE hHandle = FindWindow(NULL,」**」);

調用SendMessage接口,發送消息

SendMessage(hHandle,MYMESSAGE,DWORD,DWORD);

4.TCP\UDP通信,可實現本地計算機進程間通信也可實現不一樣操做系統下進程間通信

服務器端:可配合線程及線程池一塊兒使用,目的是爲每一個鏈接接入對應的通信soaket

1.WSAStartup 設置Socket版本信息,通常能夠是2.1 2.2

2.建立SOCKET sk = socket(AF_INET,SOCK_STREAM,0);

3.綁定socket 綁定前,須要肯定幾個參數

sockaddr_in sa;

sa.sin_family = AF_INET;

sa.sin_addr.S_un.S_addr = inet_addr(「196.168.**.**」);

sa.sin_port = htons(10000);

bind(sk,(sockaddr*)&sa,sizeof(sockaddr));

4.監聽socket

listen(sk,10);

5.接收鏈接

sockaddr_in saAcept;

Int nLen = sizeof(sockaddr_in);

accept(sk,&saAcept,&nLen);

6.接收數據recv()

Char* pBuff = new char[1024*10];

memset(pBuff,0,1024*10);

Int nRealLen = recv(pBuff,1024*10,0);

If(nRealLen < 0)

{

If(nRealLen == EAGAIN)

{

Return -1;

}

}

else

{

If(nRealLen == 0)

{

Return 0;

}

Else

{

Write(filePath,pBuff,nLen);

}

}

客戶端:

1.設定socket版本 WSAStartup 通常爲2.2

  1. 建立SOCKET sk = socket(AF_INET,SOCK_STREAM) ;//流式套接字
  2. 建立鏈接 connect() 參數

sockaddr_in sa;

sa.sin_family = AF_INET;

sa.sin_addr.S_Un.S_addr = inet_addr(「196.168.**.**」);

sa.sin_port = htons(5000);

Int nRet = connect(sk,(socketaddr*)&sa,sizeof(socketaddr));

  1. 發送數據

Char* pBuff = new char[1024*10];

Memset(pBuff,0,1024*10);

...// 數據填充代碼

Sendto(sk,pBuff,1024*10,0);

  1. 接收數據

Char* pBuff = new char[1024*10];

Memset(pBuff,0,1024*10);

Recvfrom(sk,pBuff,1024*10,0);

...數據處理

5.關閉套接字,closesocket(sk);

WSACleanup();

釋放系統網絡資源

若是沒有釋放,當程序退出時,系統會自動回收,通常客戶端和服務器均須要釋放

以上內容是這些天我的學習總結,歡迎你們提出批評

相關文章
相關標籤/搜索