進程間通訊的方法:服務器
Win32Api容許多個進程訪問同一個映射對象,獲取該映射對象的指針進行操做,這樣就實現了不一樣進程間數據共享網絡
WM_COPYDATA使用很是便利,當一個進程向另外一個進程發送消息時,只須要調用SendMessage或者PostMessage便可,消息使用條件爲,須要獲取目標進程的主窗口句柄app
實現方法:socket
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);
}
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
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));
Char* pBuff = new char[1024*10];
Memset(pBuff,0,1024*10);
...// 數據填充代碼
Sendto(sk,pBuff,1024*10,0);
Char* pBuff = new char[1024*10];
Memset(pBuff,0,1024*10);
Recvfrom(sk,pBuff,1024*10,0);
...數據處理
5.關閉套接字,closesocket(sk);
WSACleanup();
釋放系統網絡資源
若是沒有釋放,當程序退出時,系統會自動回收,通常客戶端和服務器均須要釋放
以上內容是這些天我的學習總結,歡迎你們提出批評