1. 程式人生 > >命名管道

命名管道

eve type buffers 不能 單位 線程 security time 計算

命名管道屏蔽了底層的網絡協議細節,在不了解網絡協議的情況下也可以利用命名管道來實現進程間通信;命名管道不僅可以在本機上實現兩個進程間的通信,還可以跨網絡實現兩個進程間的通信;

1、創建命名管道

  HANDLE CreateNamedPipe(

    LPCTSTR lpName,

    DWORD dwOpenMode,

    DWORD dwPipeMode,

     DWORD nMaxInstances,

    DWORD nOutBufferSize,

    DWORD nInBufferSize,

    DWORD nDefaultTimeOut,

     LPSECURITY_ATTRIBUTES lpSecurityAttributes

  );

      lpName:指向一個字符串,該字符串的格式必須為:“\\.\pipe\pipename”;該字符串開始是兩個連續的反斜杠,其後的圓點表示是本地機器,如果要與遠程的服務器建立連接,應在圓點位置處指定這個遠程服務器的名稱;接下來是“pipe”這個固定不可更改的字符串,大小寫無所謂;最後是所創建的命名管道的名稱;

      dwOpenMode:指定管道的訪問方式、重疊方式、寫直通方式、管道句柄的安全訪問方式;

        管道訪問方式:

          PIPE_ACCESS_DUPLEX --雙向模式,服務器進程和客戶端進程都可以從管道讀取數據和向管道中寫入數據;

          PIPE_ACCESS_INBOUND --服務器端只能從管道中讀取數據,客戶端只能向管道寫入數據;

          PIPE_ACCESS_OUTBOUND --服務器只能向管道中寫入數據,客戶端只能從管道中讀取數據;

        重疊方式和寫直通方式:

          FILE_FLAG_WRITE_THROUGH --允許寫直通方式;該方式只影響對字節類型管道的寫入操作,並且只有當客戶端和服務器端位於不同的計算機上時才有效;如果采用該方式,只有等到欲寫入命名管道的數據通過網絡傳送過去,並且放在了遠程計算機的管道緩沖區中後,寫數據的函數才會成功返回;

          FILE_FLAG_OVERLAPPED --允許重疊方式;如果采用該方式,那些需要一定時間才能完成的讀寫操作會立即返回,前臺線程可執行其他操作,而耗時的操作可以在後臺進行;

        管道句柄的安全訪問方式:

          WRITE_DAC --調用者對命名管道的任意訪問控制列表(ACL)都可以進行寫入訪問;

          WRITE_OWNER --調用者對命名管道的所有者可以進行寫入訪問;

          ACCESS_SYSTEM_SECURITY --調用者對命名管道的安全訪問控制列表(SACL)可以進行寫入訪問;

      dwPipeMode:指定管道句柄的類型、讀取、等待方式;同一個命名管道的每一個實例必須具有相同的類型,但不同實例可以指定不同的讀取方式和等待方式;字節模式只能用字節流方式讀取,而消息模式既可以用消息流方式讀取也可以用字節流方式讀取;設為0時取默認值;

        管道句柄的類型:

          PIPE_TYPE_BYTE --數據以字節流的形式寫入管道,該類型不能在PIPE_READMODE_MESSAGE讀方式下使用;默認類型;

          PIPE_TYPE_MESSAGE --數據以消息流的形式寫入管道;

        管道句柄的讀取方式:

          PIPE_READMODE_BYTE --以字節流的方式從管道讀取數據;默認方式;

          PIPE_READMODE_MESSAGE --以消息流的方式從管道讀取數據,該方式只能在PIPE_TYPE_MESSAGE模式下使用;

        管道句柄的等待方式:

          PIPE_WAIT --阻塞方式;默認方式;

          PIPE_NOWAIT --非阻塞方式;

      nMaxInstances:指定管道能夠創建的最多實例數;取值範圍為:1~PIPE_UNLIMITED_INSTANCES,如果是PIPE_UNLIMITED_INSTANCES則可以創建的管道實例數目僅受限於系統可使用的資源;

      nOutBufferSize:指定為輸出緩沖區所保留的字節數;

      nInBufferSize:指定為輸入緩沖區所保留的字節數;

      nDefaultTimeOut:指定默認的超時值,單位為ms;同一個管道的不同實例必須指定相同的超時值;

      lpSecurityAttributes:指向SECURITY_ATTRIBUTES結構的指針,可以設置為NULL;

2、讓服務器端等待客戶端的連接請求

  BOOL ConnectNamedPipe(

    HANDLE hNamedPipe,

    LPOVERLAPPED lpOverlapped

  );

      hNamedPipe:指向一個命名管道實例的服務器端的句柄,該句柄即為CreateNamedPipe函數的返回值;

      lpOverlapped:指向OVERLAPPED結構體的指針;如果hNamedPipe參數所標識的管道是用FILE_FLAG_OVERLAPPED標記打開的,則這個參數所指向的OVERLAPPED結構體中必須包含人工重置事件對象句柄;

3、客戶端等待可用的命名管道

  BOOL WaitNamedPipe(

    LPCTSTR lpNamedPipeName,

    DWORD nTimeOut

  );

      lpNamedPipeName:指定命名管道的名稱,名稱格式為:“\\.\pipe\pipename”,如果服務器端和客戶端在同一計算機上,名稱開始的兩個反斜杠後為圓點;如果是跨網絡通信,則在圓點位置處應指定服務器端所在主機名;

      nTimeOut:指定超時間隔,包括:

        NMPWAIT_USE_DEFAULT_WAIT --超時間隔就是服務器端創建該命名管道時指定的超時值;

        NMPWAIT_WAIT_FOREVER --一直等待,直到出現一個可用的命名管道的實例

命名管道