小弟遇到一个难题哈。代码如下,为server端的:
VOID PipeServerWriteMessage(SKYPE_PIPE_MESSAGE bMessage)
{
BOOL bSuccess = FALSE;
DWORD dwByte = 0;
DWORD dwWait = 0;
ZeroMemory(&HFPPipe.oWriteOverlap, sizeof(HFPPipe.oWriteOverlap)); 
HFPPipe.bOutMessage = bMessage;
HFPPipe.oWriteOverlap.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);/*default set to signaled state is true*/ bSuccess = WriteFile(HFPPipe.hPipe, (VOID*)&HFPPipe.bOutMessage, sizeof(HFPPipe.bOutMessage),
&dwByte, &HFPPipe.oWriteOverlap);
/// if succeed, continue next read
if (bSuccess && dwByte == sizeof(HFPPipe.bOutMessage))
{
LogEvent(_T("Write successfully(%d)"), HFPPipe.bOutMessage);
TRACE(_T("HFP send to plugin successfully(%d)\n"), HFPPipe.bOutMessage);

CloseHandle(HFPPipe.oWriteOverlap.hEvent);
HFPPipe.oWriteOverlap.hEvent = NULL;
HFPPipe.bOutMessage = PIPE_MESSAGE_MIN_ERROR; return; 
} /// write file error now
if (!bSuccess && ERROR_IO_PENDING != GetLastError())
{
LogEvent(_T("PipeServerWriteMessage write while error(%d), dwByte(%d)"), GetLastError(), dwByte);
TRACE(_T("HFP send to plugin  error(%d), dwByte(%d)"), GetLastError(), dwByte);
//      ReconnectPipe(HFPPipe);
CloseHandle(HFPPipe.oWriteOverlap.hEvent);
HFPPipe.oWriteOverlap.hEvent = NULL;
HFPPipe.bOutMessage = PIPE_MESSAGE_MIN_ERROR; return;
}////pending
TRACE("wait to HFPPipe.oWriteOverlap.hEvent\n");
WaitForSingleObject(HFPPipe.oWriteOverlap.hEvent, INFINITE);
bSuccess = GetOverlappedResult(HFPPipe.hPipe, &HFPPipe.oWriteOverlap, &dwByte, FALSE);
if (!bSuccess || dwByte != sizeof(HFPPipe.bOutMessage))
{
//      ReconnectPipe(HFPPipe);
LogEvent(_T("GetOverlappedResult  write while error(%d)"), GetLastError());
TRACE(_T("HFP delayed send (%d) plugin error(%d)\n"), HFPPipe.bOutMessage, GetLastError()); CloseHandle(HFPPipe.oWriteOverlap.hEvent);
HFPPipe.oWriteOverlap.hEvent = NULL;
HFPPipe.bOutMessage = PIPE_MESSAGE_MIN_ERROR;
return;
} LogEvent(_T("Delayed write successfully(%d)"), HFPPipe.bOutMessage); 
TRACE(_T("HFP delayed send to plugin successfully(%d)\n"), HFPPipe.bOutMessage); CloseHandle(HFPPipe.oWriteOverlap.hEvent);
HFPPipe.oWriteOverlap.hEvent = NULL;
HFPPipe.bOutMessage = PIPE_MESSAGE_MIN_ERROR;
}当前的问题是:操作流程如下时: client 写到pipe, server端读取
                               server端写到pipe, client读取
                               server端写到pipe, client读取
                               server端写到pipe, client读取
                               ……
进行几次之后,在client读取成功后,server端writefile就会出现ERROR_IO_PENDING,我就用WaitForSingleObject等其写完,但是发现其一只不返回,死等下去,要进行一次client端的写,然后server端的读操作,上次的写操作才会延迟完成。每次出现writefile pending的情况都是这样,求达人指教。

解决方案 »

  1.   

    //排版一下
    VOID PipeServerWriteMessage(SKYPE_PIPE_MESSAGE bMessage)
    {
    BOOL bSuccess = FALSE;
    DWORD dwByte = 0;
    DWORD dwWait = 0;
    ZeroMemory(&HFPPipe.oWriteOverlap, sizeof(HFPPipe.oWriteOverlap)); 
    HFPPipe.bOutMessage = bMessage;
    HFPPipe.oWriteOverlap.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);/*default set to signaled state is true*/ bSuccess = WriteFile(HFPPipe.hPipe, (VOID*)&HFPPipe.bOutMessage,
    sizeof(HFPPipe.bOutMessage),
    &dwByte, &HFPPipe.oWriteOverlap);
    /// if succeed, continue next read
    if (bSuccess && dwByte == sizeof(HFPPipe.bOutMessage))
    {
    LogEvent(_T("Write successfully(%d)"), HFPPipe.bOutMessage);
    TRACE(_T("HFP send to plugin successfully(%d)\n"), HFPPipe.bOutMessage); CloseHandle(HFPPipe.oWriteOverlap.hEvent);
    HFPPipe.oWriteOverlap.hEvent = NULL;
    HFPPipe.bOutMessage = PIPE_MESSAGE_MIN_ERROR; return; 
    } /// write file error now
    if (!bSuccess && ERROR_IO_PENDING != GetLastError())
    {
    LogEvent(_T("PipeServerWriteMessage write while error(%d), dwByte(%d)"),
    GetLastError(), dwByte);
    TRACE(_T("HFP send to plugin error(%d), dwByte(%d)"), GetLastError(), dwByte);
    // ReconnectPipe(HFPPipe);
    CloseHandle(HFPPipe.oWriteOverlap.hEvent);
    HFPPipe.oWriteOverlap.hEvent = NULL;
    HFPPipe.bOutMessage = PIPE_MESSAGE_MIN_ERROR; return;
    } ////pending
    TRACE("wait to HFPPipe.oWriteOverlap.hEvent\n");
    WaitForSingleObject(HFPPipe.oWriteOverlap.hEvent, INFINITE);
    bSuccess = GetOverlappedResult(HFPPipe.hPipe, &HFPPipe.oWriteOverlap, &dwByte, FALSE);
    if (!bSuccess || dwByte != sizeof(HFPPipe.bOutMessage))
    {
    // ReconnectPipe(HFPPipe);
    LogEvent(_T("GetOverlappedResult write while error(%d)"), GetLastError());
    TRACE(_T("HFP delayed send (%d) plugin error(%d)\n"), HFPPipe.bOutMessage,
    GetLastError()); CloseHandle(HFPPipe.oWriteOverlap.hEvent);
    HFPPipe.oWriteOverlap.hEvent = NULL;
    HFPPipe.bOutMessage = PIPE_MESSAGE_MIN_ERROR;
    return;
    } LogEvent(_T("Delayed write successfully(%d)"), HFPPipe.bOutMessage); 
    TRACE(_T("HFP delayed send to plugin successfully(%d)\n"), HFPPipe.bOutMessage); CloseHandle(HFPPipe.oWriteOverlap.hEvent);
    HFPPipe.oWriteOverlap.hEvent = NULL;
    HFPPipe.bOutMessage = PIPE_MESSAGE_MIN_ERROR;
    }
      

  2.   

    HFPPipe.oWriteOverlap.hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);/*default set to signaled state is true*/
    这个貌似是初始化来做的事情,只做一次,而不是次次都要做的。和WriteFile写在了一起不大合适吧?
      

  3.   

    WriteFile 和ReadFile都是同步操作,可以使用WriteFileEx和ReadFileEx进行异步操作