WriteFile()块(通过命名管道从C ++客户端写入C#服务器)

时间:2011-05-18 08:03:45

标签: c++ asynchronous block named-pipes writefile

我被困在这里,请帮忙。 我有一个C#命名管道服务器,管道是由:

创建的
new NamedPipeServerStream(pipeName, PipeDirection.InOut, numThreads);

在C ++中,我创建了这样的客户端:

        m_hPipe = CreateFile( 
        strPipeName,            // Pipe name 
        GENERIC_READ |  GENERIC_WRITE,  // Read and write access 
        0,              // No sharing 
        NULL,               // Default security attributes
        OPEN_EXISTING,          // Opens existing pipe 
        FILE_FLAG_OVERLAPPED,    
        NULL);  

我将管道类型设置为PIPE_READMODE_BYTE | PIPE_TYPE_BYTE
我写了一个函数WriteString()来将一个字符串写入管道。功能大致如下:

    // Write the length of the string to the pipe (using 2 bytes)
    bool bResult = WriteFile(m_hPipe, buf, 2, &cbBytesWritten, NULL);

    // Write the string itself to the pipe
    bResult = WriteFile(m_hPipe, m_chSend, len, &cbBytesWritten, NULL);

    // Flush the buffer
    FlushFileBuffers(m_hPipe);

我对该函数进行了两次调用:

    WriteString(_T("hello server!"));   // message sent and the server saw it correctly
    WriteString(_T("goodbye server!")); // message not sent, coz WriteFile() blocked here

现在的问题是:在第二次WriteString()调用中,程序在第一次WriteFile()调用时被阻塞。 只有当服务器关闭管道时,WriteFile()调用才会返回错误。

这是可靠再现的。

什么阻止WriteFile()调用?我已经在使用OVERLAPPED文件标志了。 管道缓冲区已满?我一直在服务器端读取管道。

非常感谢!

1 个答案:

答案 0 :(得分:3)

FILE_FLAG_OVERLAPPED启用异步I / O.它不会自动使任何操作异步,非阻塞或缓冲。

您需要使用WriteFile的第5个参数 - 传递OVERLAPPED结构,要么在完成时设置事件,要么将文件句柄与I/O Completion Port相关联。< / p>