青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

記錄一些學(xué)習(xí)小事

Work hard

統(tǒng)計

留言簿

閱讀排行榜

評論排行榜

進程通信——郵槽和命名管道

今天記錄下自己學(xué)的郵槽和命名管道,學(xué)習(xí)過程中遇到點問題也拿出來分享下。哈  開整
先說一下大體的概念奧。

郵槽定義

郵槽(Mailslot)也稱為郵件槽,是Windows 提供的進程間通信的手段,

其提供的是基于不可靠的,郵件槽只支持單向數(shù)據(jù)傳輸,也就是服務(wù)器只能接收數(shù)據(jù),而客戶端只能發(fā)送數(shù)據(jù),

何為服務(wù)端?創(chuàng)建郵槽的那一端就是服務(wù)端。
還有需要提及的一點是,客戶端在使用郵槽發(fā)送數(shù)據(jù)的時候只有當(dāng)數(shù)據(jù)的長度 < 425 字節(jié)時,

才可以被廣播給多個服務(wù)器,如果消息的長度 > 425 字節(jié)的話,那么在這種情形下,郵槽是不支持廣播通信的。
這是我看到的郵槽的簡要說明吧。
先說下郵槽的使用過程吧。然后再分析函數(shù),在貼代碼。非常簡單哦
服務(wù)端:                                        客戶端:
首先創(chuàng)建郵槽CreateMailslot               打開油槽CreateFile
讀取數(shù)據(jù) ReadFile                           寫入數(shù)據(jù)WriteFile
完事了,只有這四個函數(shù)。也很容易理解。 客戶端寫入數(shù)據(jù) 服務(wù)端讀取數(shù)據(jù)。
CreateMailslot(_T("\\\\.\\mailslot\\chenxiao"),0, MAILSLOT_WAIT_FOREVER,NULL);
第一個參數(shù)是個固定格式\\.\\mailslot\\name   點代表本機。mailslot是硬編碼 不能變,name可以自己起個郵槽的名字。‘\’放入字符串中要用轉(zhuǎn)義字符\
所以就寫成了"\\\\.\\mailslot\\chenxiao"
第二個參數(shù)To specify that the message can be of any size, set this value to zero. 設(shè)置成0
第三個參數(shù)為了下面的讀取操作應(yīng)該等待的時間 MAILSLOT_WAIT_FOREVER 傳這個代表參數(shù)代表永久等待。
最后一個參數(shù)安全屬性 嘎嘎 null
ReadFile(hMailSlot,pData,sizeof(TCHAR)*80,&dByteRead,NULL);
這幾個參數(shù)很簡單了。第一個參數(shù)就是創(chuàng)建郵槽返回來的句柄 第二個參數(shù)一個[out]buffer用來接收從郵槽中讀出來的東東。第三個參數(shù)就是讀取多少個字節(jié)。
第四個參數(shù)基本沒用,是一個[out]的LPDWord  很蛋疼只能DWORD dByteRead; 然后傳個他的地址。
因為msdn上說了If lpOverlapped is NULL, lpNumberOfBytesRead cannot be NULL;
lpoverlapped就是我們的最后一個參數(shù),這個參數(shù)可以設(shè)置同步和異步,如果文件打開模式是FILE_FLAG_OVERLAPPED這個的話,我們這個就不可以是NULL
這個同步異步問題我在下面的命名管道中在說。這里就先過去。這個參數(shù)設(shè)成NULL。
客戶端函數(shù)
CreateFile(_T("\\\\.\\mailslot\\chenxiao"),GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL);
這幾個參數(shù)也很容易理解了。第一個參數(shù)要和創(chuàng)建郵槽的時候的參數(shù)一樣。如果要遠程通信的話可以把‘.’設(shè)置成服務(wù)器 主機名 或者在一個區(qū)域內(nèi)廣播‘*’
但是我用兩個機器實驗了,沒有成功,目前我只能用郵槽在本地一個機器上通信。。。尷尬。。有知道怎么在兩個機器上通信的,要給我留言教教我哦。
后幾個參數(shù)根據(jù)參數(shù)名大家就可以猜個差不多了,我就不說了。吼吼。
WriteFile(hMailSlot,str,sizeof(TCHAR)*80,&dByteWrite,NULL);這個函數(shù) 跟 readfile差不多 就是向郵槽中寫入數(shù)據(jù)用的。
第二個參數(shù)是要寫入的內(nèi)容,第三個是大小(以字節(jié)為單位).
好了這幾個函數(shù)都說完了。貼上小代碼,就清晰了。

//服務(wù)器端 我用的c++寫的。
#include <iostream>
#include 
<Windows.h>
#include 
<tchar.h>
using namespace std;


int main()
{
    HANDLE hMailSlot
=CreateMailslot(_T("\\\\.\\mailslot\\chenxiao"),0,
        MAILSLOT_WAIT_FOREVER,NULL);
     TCHAR pData[
80];
     ZeroMemory(pData,
sizeof(TCHAR)*80);
     DWORD dByteRead;
     
while(1)
   
{
         BOOL b
=ReadFile(hMailSlot,pData,sizeof(TCHAR)*80,&dByteRead,NULL);
          wprintf_s(_T(
"%s\n"),pData);
     }

    
    system(
"pause");
    
return 0;
}
//客戶端我在mfc中寫的。
void CclientDlg::OnBnClickedButtonSend()
{
     TCHAR str[
80];
    ZeroMemory(str,
sizeof(TCHAR)*80);
     GetDlgItem(IDC_EDIT_INPUT)
->GetWindowText(str,70);
     DWORD dByteWrite;
     HANDLE hMailSlot
=CreateFile(_T("\\\\.\\mailslot\\chenxiao"),GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,
         FILE_ATTRIBUTE_NORMAL,NULL);
    
if (hMailSlot==INVALID_HANDLE_VALUE)
    
{
        MessageBox(_T(
"createfile失敗,請打開服務(wù)器"));
        
return ;
    }

     BOOL b
=WriteFile(hMailSlot,str,sizeof(TCHAR)*80,&dByteWrite,NULL);
     GetDlgItem(IDC_EDIT_INPUT)
->SetWindowText(_T(""));
     CloseHandle(hMailSlot);
}


這就是運行結(jié)果啦。這個東西沒啥大用。就是學(xué)習(xí)一下而已。以后萬一用到也能弄弄。

下面我說下命名管道。這個東西坑了我一下午。。。
郵槽建立的是無連接的通信。。那么命名管道 就是有鏈接的可靠的通信了。他跟郵槽挺相似的。但是比郵槽好很多。
同上面。我粘一些概念性的東西。

命名管道是通過網(wǎng)絡(luò)來完成進程之間的通信的,命名管道依賴于底層網(wǎng)絡(luò)接口,

其中包括有 DNS 服務(wù),TCP/IP 協(xié)議等等機制,但是其屏蔽了底層的網(wǎng)絡(luò)協(xié)議細節(jié),

對于匿名管道而言,其只能實現(xiàn)在父進程和子進程之間進行通信,而對于命名管道而言,

其不僅可以在本地機器上實現(xiàn)兩個進程之間的通信,還可以跨越網(wǎng)絡(luò)實現(xiàn)兩個進程之間的通信。

命名管道使用了 Windows 安全機制,因而命名管道的服務(wù)端可以控制哪些客戶有權(quán)與其建立連接,

而哪些客戶端是不能夠與這個命名管道建立連接的。

利用命名管道機制實現(xiàn)不同機器上的進程之間相互進行通信時,

可以將命名管道作為一種網(wǎng)絡(luò)編程方案時,也就是看做是 Socket 就可以了,

它實際上是建立了一個客戶機/服務(wù)器通信體系,并在其中可靠的傳輸數(shù)據(jù)。

命名管道的通信是以連接的方式來進行的,

服務(wù)器創(chuàng)建一個命名管道對象,然后在此對象上等待連接請求,

一旦客戶連接過來,則兩者都可以通過命名管道讀或者寫數(shù)據(jù)。          

命名管道提供了兩種通信模式:字節(jié)模式和消息模式。

在字節(jié)模式下,數(shù)據(jù)以一個連續(xù)的字節(jié)流的形式在客戶機和服務(wù)器之間流動,

而在消息模式下,客戶機和服務(wù)器則通過一系列的不連續(xù)的數(shù)據(jù)單位,進行數(shù)據(jù)的收發(fā),

每次在管道上發(fā)出一個消息后,它必須作為一個完整的消息讀入。

我相信很多人看了幾句就跳到這里來了。。概念性的東西 確實太不好玩了。我也不愛看。。哈哈
介紹命名管道需要的函數(shù)。
服務(wù)器端

CreateNamedPipe 創(chuàng)建命名管道

 ConnectNamedPip  連接
ReadFile    讀
WriteFile  寫

客戶端

WaitNamedPipe 查看命名管道
CreateFile  打開命名管道
WriteFile ReadFile  寫   讀

就這些東西,今天由于不仔細看msdn 寫程序?qū)懨闪恕?。。等會我在說啊。大家要注意哦。
CreateNamedPipe(_T("\\\\.\\pipe\\chenxiao"),PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED,PIPE_TYPE_BYTE,1,1024,1024,2000,NULL);
很多參數(shù)??!不怕不怕 慢慢來
第一個我略過了哦。第二個大家在msdn上可以看到有
PIPE_ACCESS_DUPLEX   讀寫雙向
PIPE_ACCESS_INBOUND   數(shù)據(jù)只能從客戶端到服務(wù)端
PIPE_ACCESS_OUTBOUND  和上面那個相反
這個參數(shù)我們設(shè)置成 第一個。然而通過msdn大家可以看到這個參數(shù)可以附加 flag  我們就附加FILE_FLAG_OVERLAPPED 這個了
MSDN那一大堆英文我也瞅不太明白,大至意思就是這個呢 用了這個參數(shù) 程序操作讀,寫,連接等操作,可以立馬返回。比如說讀一個大文件吧

你把這個文件從頭讀到偉 需要很長時間。這樣的話你的readfile函數(shù)就不會反回  就會阻塞在那里一直讀。這樣很不好,所以有了這個參數(shù)。這個參數(shù)就是使你的讀 寫 等待函數(shù)立馬返回,這個就屬于程序的異步,這個讀函數(shù)和主程序一起執(zhí)行。
下一個參數(shù)就是以字節(jié)流還是消息方式發(fā)送文件 讀取文件。我們采用字節(jié)流方式PIPE_TYPE_BYTE。
下一個參數(shù)是最多可以創(chuàng)建幾個命名管道 比如我們設(shè)置成3,就是可以創(chuàng)建3個這樣的管道。我們這里設(shè)置成1,我們只用一個管道做演示就行。然后是分配的輸入 輸出 緩沖區(qū)大小 ,就類似創(chuàng)建線程時分配??臻g大小一樣。然后是一個超時時間設(shè)置 這個設(shè)置成0就可以。最后一個NULL安全屬性

ConnectNamedPipe服務(wù)端的連接管道函數(shù)這個函數(shù)兩個參數(shù)第一個參數(shù)句柄,第二個參數(shù)一個結(jié)構(gòu)體對象
這個結(jié)構(gòu)體呢 里面有一個事件句柄。剛才上邊由于設(shè)置了異步,所以你要有一個標志著讀結(jié)束的標志,這個標志就用的這個事件。創(chuàng)建這個事件要設(shè)置成手動的,初始為無信號。

這樣服務(wù)端的就寫完了。
然后再說一下客戶端的函數(shù)
WaitNamedPipe(_T("\\\\.\\pipe\\chenxiao"),0);
這個函數(shù)呢就屬于一個查看函數(shù),看看有沒有叫chenxiao的命名管道
大家不要認為這個函數(shù)可以打開命名管道 或者連接管道
大家從msdn上可以看到這句話If the function succeeds,the process should use the CreateFile function to open a handle to the named pipe
今天我由于沒看到這句話苦苦弄了一個下午也沒連上管道5555555555
在客戶端可以用waitnamedpipe檢查下有沒有這個管道 然后再createfile打開它。
哦了 搞定了。搞上我的代碼瞅瞅效果。

 

//服務(wù)器端的代碼  MFC寫的

void CPipeServerDlg::OnBnClickedButtonCreate()
{
    m_hNP
=CreateNamedPipe(_T("\\\\.\\pipe\\chenxiao"),
        PIPE_ACCESS_DUPLEX
|FILE_FLAG_OVERLAPPED,
        PIPE_TYPE_BYTE,
1,1024,1024,0,NULL);
    
if (m_hNP==INVALID_HANDLE_VALUE)
    
{
        MessageBox(_T(
"創(chuàng)建管道失敗"));
    }

    
else
    
{
        MessageBox(_T(
"創(chuàng)建管道成功"));
    }

    
//連接-----------------------------
    
    OVERLAPPED op;
    ZeroMemory(
&op,sizeof(OVERLAPPED));
    op.hEvent
=CreateEvent(NULL,TRUE,FALSE,NULL);
    BOOL b
=ConnectNamedPipe(m_hNP,&op);
    
if (WaitForSingleObject(op.hEvent,INFINITE)==0)
    
{
        MessageBox(_T(
"connect成功 haha"));
    }

    
else
    
{
        MessageBox(_T(
"create fail"));
    }

}


void CPipeServerDlg::OnBnClickedButtonWrite()
{

    TCHAR buff[
100]=_T("來自服務(wù)器的信息");
    DWORD d;
    WriteFile(m_hNP,buff,
200,&d,NULL);
}


void CPipeServerDlg::OnBnClickedButtonRead()
{
    TCHAR buff[
100];
    ZeroMemory(buff,
200);
    DWORD d;
    ReadFile(m_hNP,buff,
200,&d,NULL);
    MessageBox(buff);
}

 

//客戶端的代碼 MFC寫的


void CPipeClientDlg::OnBnClickedButtonOpenpipe()
{
    BOOL b
=WaitNamedPipe(_T("\\\\.\\pipe\\chenxiao"),0);
    
//BOOL b=1;
    m_hFile = CreateFile(_T("\\\\.\\pipe\\chenxiao"), 
        GENERIC_READ 
| GENERIC_WRITE,
        
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
if (!b||m_hFile==INVALID_HANDLE_VALUE)
    
{
        MessageBox(_T(
"連接失敗"));
    }

    
else
    
{
        MessageBox(_T(
"連接成功"));
    }

}


void CPipeClientDlg::OnBnClickedButtonRecieve()
{
    TCHAR buff[
100];
    ZeroMemory(buff,
200);
    DWORD d;
    ReadFile(m_hFile,buff,
200,&d,NULL);
    MessageBox(buff);
}


void CPipeClientDlg::OnBnClickedButtonSend()
{
    TCHAR buff[
100]=_T("client's message");
    DWORD d;
    WriteFile(m_hFile,buff,
200,&d,NULL);
}

下圖程序運行效果圖

哇卡卡阿卡














 

posted on 2011-08-01 22:14 陳曉 閱讀(5445) 評論(6)  編輯 收藏 引用

評論

# re: 進程通信——郵槽和命名管道 2011-08-02 12:18 yotta123

沒事還是不要用油槽!  回復(fù)  更多評論   

# re: 進程通信——郵槽和命名管道 2011-08-02 12:35 陳曉

恩,我上邊也說了,沒什么大用,就是供學(xué)習(xí)用用。書上都說什么可以廣播什么的方便,但是我用這玩意兩臺機器通信都沒搞上。。@yotta123
  回復(fù)  更多評論   

# re: 進程通信——郵槽和命名管道 2013-12-31 21:33 MeiJi

樓主好,剛才試了一下在管道的實例中,其他正常,但是服務(wù)器的讀或者client的接受函數(shù)會出錯,然后調(diào)試的時候發(fā)現(xiàn)readfile()第一個參數(shù)句柄無效(調(diào)試直接彈出中斷或繼續(xù)對話框),不曉得為什么。write();的句柄是有效地。忘答復(fù),謝謝  回復(fù)  更多評論   

# re: 進程通信——郵槽和命名管道 2014-10-11 16:56 Mr zhang

最好還是封裝一下。  回復(fù)  更多評論   

# re: 進程通信——郵槽和命名管道 2015-07-22 14:50 sad

MeiJi用戶,我覺得是不是你的事件對象搞錯了,這里是自動復(fù)位,初始為無信號,等待連接再激活這個信號,如果開始為有信號經(jīng)過重疊對象可能會出錯  回復(fù)  更多評論   

# re: 進程通信——郵槽和命名管道 2015-07-22 14:54 sad

樓主!你的命名通道試過兩臺電腦通訊過嗎?成功沒?我都沒試過,全在自己電腦上調(diào)試的‘  回復(fù)  更多評論   


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线播放高清精品| 国产日韩精品电影| 亚洲第一黄色网| 在线观看一区二区精品视频| 欧美一区二粉嫩精品国产一线天| 亚洲国产精品www| 久久免费观看视频| 另类春色校园亚洲| 国精产品99永久一区一区| 欧美主播一区二区三区| 久久久久在线观看| 好看的日韩视频| 久久久久久尹人网香蕉| 欧美成人蜜桃| 黄色日韩网站视频| 久久综合色8888| 国产欧美一区二区精品性| 午夜视频在线观看一区| 亚洲在线1234| 国产午夜精品全部视频播放| 欧美在线视频观看| 欧美成人精品一区二区| 在线观看国产一区二区| 欧美国产视频在线观看| 亚洲毛片网站| 欧美一区激情视频在线观看| 欧美午夜片在线免费观看| 亚洲欧美另类国产| 老鸭窝亚洲一区二区三区| 亚洲精品久久| 欧美午夜电影在线| 欧美在线观看天堂一区二区三区| 美日韩精品免费| 一区二区精品在线观看| 国产午夜精品一区二区三区视频| 久久九九国产精品| 亚洲人午夜精品| 午夜天堂精品久久久久| 国产一区二区三区高清在线观看| 蜜桃伊人久久| 亚洲欧美国产77777| 欧美 亚欧 日韩视频在线| 夜夜嗨av一区二区三区网页| 国产亚洲精品福利| 欧美极品在线播放| 久久gogo国模裸体人体| 亚洲福利视频三区| 久久av在线| 日韩网站在线观看| 国产精品久久久久久久久久尿 | 亚洲影院色在线观看免费| 久久精品视频免费观看| 日韩一二三在线视频播| 国产在线精品成人一区二区三区| 欧美久久综合| 久久精品国产精品亚洲综合| 亚洲国产网站| 久久亚洲私人国产精品va| 亚洲婷婷国产精品电影人久久| 狠狠色狠狠色综合人人| 欧美性大战久久久久久久| 蜜臀va亚洲va欧美va天堂| 在线午夜精品自拍| 最新亚洲视频| 欧美**字幕| 久久久999| 亚洲欧美国产精品专区久久| 亚洲国产日韩一区二区| 国产一区二区三区丝袜 | 国产欧美日韩精品一区| 久久嫩草精品久久久精品一| 亚洲一区二区精品视频| 亚洲欧洲综合另类| 欧美sm视频| 久久免费国产精品| 亚洲欧美久久久久一区二区三区| 亚洲精品一区二区网址| 黄色成人在线| 国产日韩专区| 国产美女诱惑一区二区| 国产精品黄页免费高清在线观看| 欧美 日韩 国产精品免费观看| 久久精品夜色噜噜亚洲aⅴ| 亚洲综合欧美日韩| 亚洲一区二区免费在线| 日韩午夜激情电影| 亚洲激情第一页| 亚洲高清电影| 亚洲免费观看视频| 亚洲资源在线观看| 久久精品99无色码中文字幕| 久久久久国产精品午夜一区| 久久艳片www.17c.com| 麻豆成人91精品二区三区| 欧美黄污视频| 国产精品久久久久影院色老大| 国产欧美精品xxxx另类| 精品91在线| 99亚洲一区二区| 午夜欧美大片免费观看| 久久综合电影一区| 亚洲人成网站在线观看播放| 亚洲天堂免费观看| 久久久久一区二区三区四区| 欧美成人在线免费观看| 国产精品日韩久久久久| 在线观看一区欧美| 亚洲一区在线免费| 久久综合九色综合欧美狠狠| 亚洲三级电影全部在线观看高清| 亚洲伊人伊色伊影伊综合网 | 在线观看成人小视频| 亚洲精品美女久久7777777| 亚洲女女做受ⅹxx高潮| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲人成久久| 午夜一区二区三区在线观看| 免费黄网站欧美| 国产精品视频网| 亚洲国产欧美一区| 欧美一级成年大片在线观看| 亚洲黄色成人网| 欧美在线亚洲一区| 欧美日韩亚洲综合| 亚洲成色777777女色窝| 午夜精品福利在线| 亚洲国产天堂久久综合| 欧美中文在线视频| 欧美三级精品| 亚洲国产成人久久综合一区| 欧美影院久久久| 亚洲精品欧美精品| 免费91麻豆精品国产自产在线观看| 欧美午夜精品久久久久久孕妇| 亚洲第一精品久久忘忧草社区| 亚洲欧美久久久久一区二区三区| 亚洲二区视频| 久久久久久久综合狠狠综合| 国产精品美女主播| 一区二区三区视频在线看| 欧美成人激情视频| 久久本道综合色狠狠五月| 国产精品成人av性教育| 一本久久a久久精品亚洲| 你懂的成人av| 久久精品国产99精品国产亚洲性色 | 欧美日韩视频在线一区二区观看视频| 国内伊人久久久久久网站视频| 亚洲无限av看| 亚洲伦伦在线| 欧美精品福利在线| 亚洲精品国产拍免费91在线| 欧美成人免费观看| 老司机aⅴ在线精品导航| 狠狠干成人综合网| 久久久久久久久岛国免费| 亚洲午夜国产成人av电影男同| 欧美日韩精品一区二区在线播放 | 在线看国产一区| 久久人人97超碰人人澡爱香蕉| 午夜精品区一区二区三| 国产精品免费网站在线观看| 亚洲综合精品| 亚洲男人的天堂在线| 国产精品亚洲综合一区在线观看| 亚洲男人的天堂在线观看 | 欧美日韩mv| 一本色道久久综合亚洲精品按摩| 亚洲国产欧美在线| 欧美高清hd18日本| 99这里有精品| 日韩午夜激情av| 国产精品第13页| 亚洲免费影视| 亚洲女人天堂成人av在线| 国产精品区一区二区三| 久久精品国产99| 久久久亚洲国产美女国产盗摄| 激情综合视频| 亚洲国产成人av在线| 欧美日韩精品二区第二页| 一本色道88久久加勒比精品| 99riav1国产精品视频| 国产精品久久久久久久第一福利| 午夜亚洲视频| 久久久久久久一区| 日韩亚洲不卡在线| 亚洲永久免费| 亚洲第一级黄色片| 亚洲美女在线看| 国产欧美视频在线观看| 麻豆精品在线视频| 欧美母乳在线| 久久黄金**| 欧美成va人片在线观看| 亚洲欧美国产日韩天堂区| 久久精品99国产精品酒店日本| 亚洲理伦在线| 欧美一级一区| 99精品国产热久久91蜜凸|