• 2006-11-19

    第四章 命名管道 - [多线程程序设计]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://xingzhesun.blogbus.com/logs/3866174.html

    第四章 命名管道
    是一种简单的进程之间通信的机制。
    4.1实施细节
    命名管道是围绕Windows文件系统设计的一种技术,采用命名管道文件系统(Named Pipe File System NPFS)接口。
    它依赖MSNP重定向器再网上进行命名管道数据的发送和接收。
    4.1.1命名规范
    \\server\Pipe\[path]name
    4.1.2字节模式和消息模式
    字节模式:在任何一个特定的时间段内,客户服务器不知道有多少字节从管道读入和写入。
    消息模式:每次在管道发送一条消息后,必须作为一条完整的消息读入。
    4.1.3应用程序的编译
    winbase.h+kernel32.lib
    4.1.4错误代码
    winerror.h
    4.2客户机服务器基础
    4.2.1服务器细节
    1)CreateNamedPipe
    2)ConnectNamedPipe监听客户机的连接
    3)ReadFile WriteFile
    4)DisconnectNamedPipe()
    5)CloseHandle()

    void main()
    {
    HANDLE ThreadHandle;
    int i;
    DOWRD ThreadId;
    for(i=0; i<5;i++)
    {
    if((ThreadHandle = CreateThread(NULL, 0, PipeInstanceProc,
    NULL, 0, &ThreadId)) == NULL)
    {
    return;
    }
    CloseHandle(ThreadHandle)
    _getch();
    }
    }

    DWORD WINAPI PipeInstanceProc(LPVOID lpParameter)
    {
    HANDLE PipeHandle;
    DWORD BytesRead;
    DWORD BytesWrite;
    CHAR Buffer[256];

    if((PipeHandle = CreateNamedPiped("\\\\.\\PIPE\\jim",
    PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE|PIPE_READMODE_BYTE,
    NUM_PIPES,0,0,1000, NULL))==INVALID_HANDLE_VALUE)
    {return 0;}

    while(1)
    {
    if(ConnectNamedPipe(PipeHandle, NULL)==0)
    { break;}

    while(ReadFile(PipeHandle, Buffer, sizeof(Buffer),&BytesRead,NULL)>0)
    {
    }

    if(DisconnectNamedPipe(PipeHandle)==0)
    {return;}

    CloseHandle(PipeHandle);

    }
    }
    2.重叠IO
    允许Win32API函数在发出IO之后以一部方式工作。
    4.2.3客户机细节
    1)WaitNamedPipe
    2)CreateFile
    3)WriteFile&ReadFile
    4)CloseHanlde
    4.3OtherAPI
    CallNamedPipe
    TransactNamedPipe
    SetNamedPipeHandleState
    GetNamedPipeHandleState


    收藏到:Del.icio.us