命名管道读取超时

时间:2012-12-07 17:23:42

标签: c++ windows timeout named-pipes

我正在尝试为我的命名管道的读取操作设置超时 为了从命名管道中读取,我正在使用ReadFile函数 我读到可以使用SetCommTimeouts函数为此函数设置超时,但是当我尝试使用它时,出现系统错误1:“功能不正确”。
这是我的代码(这是客户端):

m_pipe = CreateFileA(pipeName,   // pipe name 
                         GENERIC_READ |  // read and write access 
                         GENERIC_WRITE, 
                         0,              // no sharing 
                         NULL,           // default security attributes
                         OPEN_EXISTING,  // opens existing pipe 
                         0,              // default attributes 
                         NULL);          // no template file 

    if (m_pipe != INVALID_HANDLE_VALUE)
    {
            DWORD mode = PIPE_READMODE_MESSAGE | PIPE_WAIT;
            ok = SetNamedPipeHandleState(m_pipe, &mode, NULL, NULL);
            COMMTIMEOUTS cto;
            cto.ReadTotalTimeoutConstant = 1000;
            BOOL time = SetCommTimeouts(m_pipe, &cto);
    }

我做错了什么或者SetCommTimeouts方法不应该用于管道?有没有其他方法可以获得阅读超时?

3 个答案:

答案 0 :(得分:12)

如果超时的目的不是卡住forever,您可以考虑在定时循环中调用PeekNamedPipe(...)。这样您就可以检查是否有任何东西需要不时阅读。 或者,可以使用PeekNamedPipe来判断管道上的读取是否实际上在执行读取之前 。这样就可以避免“等待”阅读。

答案 1 :(得分:3)

您不能将SetCommTimeouts与命名管道一起使用。如果您想要超时,则必须使用异步I / O并使用CancelIoCancelIoEx

自行实施超时

答案 2 :(得分:1)

ReadFile阻塞,直到它读取所请求的字节数或发生错误/中止。重叠的工作方式相同,即在相同条件下完成。试图使用CancelIoEx实现超时,并发现它丢失了数据。到目前为止,看不到实现超时的方法,只读取部分请求的字节数,或读取缓存的数据。