我被困在这里,请帮忙。 我有一个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文件标志了。 管道缓冲区已满?我一直在服务器端读取管道。
非常感谢!
答案 0 :(得分:3)
FILE_FLAG_OVERLAPPED
启用异步I / O.它不会自动使任何操作异步,非阻塞或缓冲。
您需要使用WriteFile
的第5个参数 - 传递OVERLAPPED
结构,要么在完成时设置事件,要么将文件句柄与I/O Completion Port相关联。< / p>