C++ 命名管道读取超时
我正在尝试为命名管道的读取操作设置超时。C++ 命名管道读取超时,c++,windows,timeout,named-pipes,C++,Windows,Timeout,Named Pipes,我正在尝试为命名管道的读取操作设置超时。 为了从命名管道中读取,我使用了ReadFile函数。 我了解到,可以使用SetCommTimeouts函数为此函数设置超时,但当我尝试使用它时,会出现系统错误1:“函数不正确”。 这是我的代码(这是客户端): 我是否做错了什么,或者SetCommTimeouts方法不应该与管道一起使用?是否有其他方法获得读取超时?不能对命名管道使用SetCommTimeout。如果你想超时,你必须使用异步I/O,并使用 > CaseLeIO < /C>或 CaseLoE
为了从命名管道中读取,我使用了
ReadFile
函数。我了解到,可以使用
SetCommTimeouts
函数为此函数设置超时,但当我尝试使用它时,会出现系统错误1:“函数不正确”。这是我的代码(这是客户端):
我是否做错了什么,或者
SetCommTimeouts
方法不应该与管道一起使用?是否有其他方法获得读取超时?不能对命名管道使用SetCommTimeout。如果你想超时,你必须使用异步I/O,并使用<代码> > CaseLeIO < /C>或<代码> CaseLoEX < /C> < /P> > P>实现超时。如果超时的目的是不被卡住<代码>永远>代码>,你可以考虑在一个定时循环中调用。通过这种方式,你可以检查是否有任何东西可以随时阅读。
或者,可以使用
PeekNamedPipe
来确定在执行读取之前,管道上的读取是否实际将获得任何。这样可以避免“等待”读取。读取文件会阻塞,直到读取请求的字节数或发生错误/中止。重叠工作原理相同,即在相同条件下完成。试图使用CancelIoEx实现超时,但发现它丢失了数据。到目前为止,还没有办法实现超时和只读取部分请求的字节数,或者读取缓存数据。您能解释一下,为什么不能将超时与命名管道一起使用,或者提供指向此知识来源的链接?不幸的是,答案是:“因为您不能:API不允许。”我希望我有一个更好的,更深入的回答给你,唉,我没有。你可能想读书。底线:如果您想要“超时”,您需要使用重叠I/O。好的,谢谢。我考虑使用PeekNamedPipe,但代码“正在构建中”。你是一个英雄。
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);
}