命名管道读取超时
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实现超时,并发现它会丢失数据。到目前为止,还没有办法实现超时并仅读取请求的部分字节量或读取缓存的数据。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 如何在C++(VS2010)中设置超时读取USB端口?
- 为什么我在蓝牙连接()上收到"java.io.IOException:读取失败,套接字可能关闭或超时,读取re
- 是否可以处理超时的阻塞读取功能?
- 串口读取功能的通信超时和线程不超时
- 从wifi始终超时从UDP插座读取
- 命名管道读取超时
- Win32 - 从标准输入读取超时
- C++跨平台超时读取
- 字节间延迟时间的读取文件超时
- 如何使“std::cin”的读取在特定时间后超时
- 在c++和Linux中,在有超时的情况下向串行端口写入和从串行端口读取数据
- Boost ASIO套接字读取N字节不多不少,等待它们到来或超时异常
- 如何确定读取文件函数超时
- Udp选择超时问题.超时或从所有客户端读取
- RFID虚拟串口读取数据时超时