进程间通信(6) 邮槽
- 郵槽是基于廣播通信體系設(shè)計出來的,它采用無連接的不可靠的數(shù)據(jù)傳輸。
- 郵槽是一種單向通信機制,創(chuàng)建郵槽的服務(wù)器進(jìn)程讀取數(shù)據(jù),打開郵槽的客戶端寫入數(shù)據(jù)。
- 郵槽可以實現(xiàn)一對多的單向通信。但是數(shù)據(jù)量小,通常都是424字節(jié)以下。假設(shè)client1先send,client2再send,最后server可以連續(xù)receive兩次
- 如果是網(wǎng)絡(luò)通信,server的名稱寫".",client寫服務(wù)器電腦名或ip地址
1. 過程
a. server 先CreateMailslot
b. client 再CreateFile連接之前的mailSlot
c. client writeFile
d. server readFile
2.該函數(shù)利用指定的名稱來創(chuàng)建一個郵槽,然后返回所創(chuàng)建的郵槽的句柄。
HANDLE WINAPI CreateMailslot(__in LPCTSTR lpName,__in DWORD nMaxMessageSize,__in DWORD lReadTimeout,__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes );-
參數(shù) lpName
指定了將要創(chuàng)建的郵槽的名稱,該名稱的格式必須為 \.\mailslot\MailslotName。
在這里需要注意的是兩個斜杠后的那個 “.”,在這里使用圓點代表的是本地機器, -
參數(shù) nMaxMessageSize
用來指定可以被寫入到郵槽的單一消息的最大尺寸,為了可以發(fā)送任意大小的消息,需要將該參數(shù)設(shè)置為 0 。 -
參數(shù) lReadTimeOut
指定讀取操作的超時時間間隔,以毫秒作為單位。
讀取操作在超時之前可以等待一個消息被寫入到郵槽中,如果將這個值設(shè)置為 0 ,那么若沒有消息可用的話,該函數(shù)將立即返回。如果將該值設(shè)置為 MAILSLOT_WAIT_FOREVER,則該函數(shù)會一直等待,直到有消息可用。 -
參數(shù) lpSecurityAttributes
一般設(shè)置為 NULL 即可,即采用 Windows 默認(rèn)的針對于郵槽的安全性。
3. code
server:
HANDLE hMailslot;hMailslot=CreateMailslot("\\\\.\\mailslot\\MyMailslot",0,MAILSLOT_WAIT_FOREVER,NULL);if(INVALID_HANDLE_VALUE==hMailslot){MessageBox("創(chuàng)建郵槽失敗!");return;}char buf[100];DWORD dwRead;if(!ReadFile(hMailslot,buf,100,&dwRead,NULL)){MessageBox("讀取數(shù)據(jù)失敗!");CloseHandle(hMailslot);return;}MessageBox(buf);CloseHandle(hMailslot);client
HANDLE hMailslot;hMailslot=CreateFile("\\\\.\\mailslot\\MyMailslot",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);if(INVALID_HANDLE_VALUE==hMailslot){MessageBox("打開郵槽失敗!");return;}char buf[]="http://www.sunxin.org";DWORD dwWrite;if(!WriteFile(hMailslot,buf,strlen(buf)+1,&dwWrite,NULL)){MessageBox("寫入數(shù)據(jù)失敗!");CloseHandle(hMailslot);return;}CloseHandle(hMailslot);【引用】
總結(jié)
以上是生活随笔為你收集整理的进程间通信(6) 邮槽的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 进程间通信(5) 命名管道2 不同机器通
- 下一篇: 进程间通信(7) “剪贴板“、“匿名管道