命名管道无法再次连接
Named pipe can't connect for second time
我有一个客户端服务器的流程,当我第一次尝试连接时,一切都可以,但是当我再次启动客户端过程而不重新启动服务器时,我无法与pipe_busy错误,尽管getoverlappedresult在服务器上取得了成功,但是waitforsingleobject并未表示连接的人,并且该消息是空的。
std::wstring buffer;
while (true) {
// pinging here...
DWORD result = WaitForSingleObject(hEvent, 2000);
if (result == WAIT_FAILED) {
std::wcout << result << std::endl;
break;
}
if (result == WAIT_TIMEOUT) {
// always here
}
ResetEvent(hEvent);
DWORD bytesTransferred;
OVERLAPPED ov;
ZeroMemory( & ov, sizeof(OVERLAPPED));
ov.hEvent = hEvent;
if (GetOverlappedResult(pipe(), & ov, & bytesTransferred, TRUE) == 0) // FAILED
{
return; // we do never get here...
} else {
ZeroMemory( & ov, sizeof(OVERLAPPED));
DWORD bytesToRead = 0;
BOOL pingPipe;
Timer timer(1000);
while (!bytesToRead || !pingPipe) {
if (!timer.in()) {
break;
}
pingPipe = PeekNamedPipe(pipe(), NULL, 0, NULL, & bytesToRead, NULL);
}
buffer.resize(sizeof(TCHAR) * bytesToRead);
if (!ReadFile(pipe(), & buffer[0], bytesToRead, & bytesTransferred, & ov) && timer.in()) {
if (GetLastError() == ERROR_IO_PENDING) {
continue;
}
return;
}
// data here
std::wcout << buffer << std::endl;
}
}
DisconnectNamedPipe(pipe());
我无法确切地说出什么是hEvent
是什么,因为您遗漏了所有初始化代码,但是您不正确地使用了GetOverlappedResult
,并且所有赌注都在此关闭了:
OVERLAPPED ov;
ZeroMemory( & ov, sizeof(OVERLAPPED));
ov.hEvent = hEvent;
if (GetOverlappedResult(pipe(), & ov, & bytesTransferred, TRUE) == 0) ...
这不是您的方式。您不会声明OVERLAPPED
,而是将其传递给GetOverlappedResult
。您实际上必须 start 一个重叠的操作(读,写,连接等),例如首先将OVERLAPPED
传递给ReadFile
或其他东西。事件处理方法通常是您创建的事件,即对重叠任务的专用,而不是其他任何任务。
这相当于您走到街上一个随机的陌生人,说出"所以,你得到了我要的东西吗?"。
您正在尝试完成您尚未启动的重叠操作,并且您正在使用一个事件手柄,大概也使用该操作来检查传入的连接之类的东西。所以这几乎是在空中发生的事情。
所以您有两个选择:
- 阅读本教程(我尚未验证正确性,但瞥见它看起来不错),重叠I/O的概述以及带有重叠的I/O的命名管服务器的示例,然后阅读所有内容再一次,直到您理解它或
- 停止使用重叠的I/O。这就是我现在建议的只是为了降低概念。
除了上述内容外,您的客户端可能还会出现其他问题,但是您尚未显示为此的代码。您可能需要对相关文档进行仔细检查,以确保此目的一切正常。另外,就丢失的代码而言,您需要通过传递创建时的适当标志来验证服务器端上的管道(无法查找,在此编辑中查看,但请检查管道创建API文档)。
相关文章:
- 在没有管理员权限的情况下连接到同一网络中的命名管道
- 阻塞管道连接命名管道不触发
- 使用提升连接已创建的命名管道
- range-v3:将管道范围与分律器连接起来
- 命名管道无法再次连接
- 如何知道何时有最大数量的命名管道客户端与服务的连接?
- C#C++命名管道连接
- MySQL Windows c api 命名管道错误:"在'等待初始通信数据包'时丢失与 MySQL 服务器的连接,系统错误:0
- 为什么 read() 在管道连接到使用 boost::asio for STDIN/STDOUT 的程序时,使用 EAG
- 连接到子进程stdout的管道中的消息不完整
- 命名管道:连接命名管道返回ERROR_BROKEN_PIPE后的读取文件
- 从 c++ 到 Java 行的命名管道连接,每个字符之间有空格
- 无法连接到命名管道
- 具有IP地址的命名管道连接
- boost asio async_write未在断开连接的客户端上生成管道破裂或其他错误
- 从Ada程序到C++程序的管道连接
- 使用c#,如何连接到一个单向的c++命名管道
- 命名管道在后台等待客户端,直到客户端连接
- 如何执行和写入stdin并将stdout管道连接到套接字
- 从 C++ win32 程序连接到命名管道时出现问题