[英]Named-pipe reading timeout
我正在尝试为我的命名管道的读取操作设置超时。
为了从命名管道读取,我正在使用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
方法不应该与管道一起使用? 有没有其他方法可以获得读取超时?
如果超时的目的是forever
不会卡住,你可以考虑在定时循环中调用PeekNamedPipe(...) 。 这样您就可以检查是否有任何东西需要不时阅读。 或者,可以使用PeekNamedPipe
来确定在执行读取之前管道上的读取是否实际上将获得任何内容。 这样可以避免“等待”读取。
您不能将SetCommTimeouts与命名管道一起使用。 如果您想要超时,则必须使用异步I / O并使用CancelIo
或CancelIoEx
实现超时
ReadFile阻塞,直到它读取请求的字节数或错误/中止发生。 重叠工作相同,即它在相同条件下完成。 试图使用CancelIoEx实现超时,并发现它丢失了数据。 到目前为止,看不到实现超时的方法,只读取部分请求的字节数,或读取缓存的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.