命名管道有时不';行不通 我写了一个C++应用程序,它通过命名管道连接到一个不真实的引擎4游戏。95%的时间它工作正常,但有时它似乎连接不好。这是非常随机的,所以我很难找到导致这种情况的问题。服务器是在我的应用程序中创建的,客户端是在UE4游戏中创建的。有时UE4游戏无法连接并显示错误121: // // MessageId: ERROR_SEM_TIMEOUT // // MessageText: // // The semaphore timeout period has expired. // #define ERROR_SEM_TIMEOUT 121L
正如我所说,问题是随机发生的,我似乎找不到导致问题的具体原因。管道已成功创建,我可以在windows powershell中看到这一点(get childitem\。\pipe) 我在想也许我使用的管道设置有问题 这是我创建管道服务器的代码:命名管道有时不';行不通 我写了一个C++应用程序,它通过命名管道连接到一个不真实的引擎4游戏。95%的时间它工作正常,但有时它似乎连接不好。这是非常随机的,所以我很难找到导致这种情况的问题。服务器是在我的应用程序中创建的,客户端是在UE4游戏中创建的。有时UE4游戏无法连接并显示错误121: // // MessageId: ERROR_SEM_TIMEOUT // // MessageText: // // The semaphore timeout period has expired. // #define ERROR_SEM_TIMEOUT 121L,c++,named-pipes,unreal-engine4,C++,Named Pipes,Unreal Engine4,正如我所说,问题是随机发生的,我似乎找不到导致问题的具体原因。管道已成功创建,我可以在windows powershell中看到这一点(get childitem\。\pipe) 我在想也许我使用的管道设置有问题 这是我创建管道服务器的代码: DWORD erPipeServer::CreatePipeServer() { // create a SECURITY_ATTRIBUTES structure. if (!CreatePipeSecurity(&pS
DWORD erPipeServer::CreatePipeServer() {
// create a SECURITY_ATTRIBUTES structure.
if (!CreatePipeSecurity(&pSa))
{
dwError = GetLastError();
//wprintf(L"CreatePipeSecurity failed w/err 0x%08lx\n", dwError);
Cleanup();
return dwError;
}
// Create the named pipe.
hNamedPipe = CreateNamedPipe(
pipename, // Pipe name.
PIPE_ACCESS_DUPLEX, // The pipe is duplex; both server and
// client processes can read from and
// write to the pipe
PIPE_TYPE_MESSAGE | // Message type pipe
PIPE_READMODE_MESSAGE | // Message-read mode
PIPE_NOWAIT, // Blocking mode is enabled
PIPE_UNLIMITED_INSTANCES, // Max. instances
BUFFER_SIZE, // Output buffer size in bytes
BUFFER_SIZE, // Input buffer size in bytes
NMPWAIT_WAIT_FOREVER, // Time-out interval
pSa // Security attributes
);
if (hNamedPipe == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();
//wprintf(L"Unable to create named pipe w/err 0x%08lx\n", dwError);
Cleanup();
return dwError;
}
//wprintf(L"The named pipe (%s) is created.\n", pipename);
return dwError;
}
这是我在虚幻引擎4中创建客户端的代码:
// Try to open the named pipe identified by the pipe name.
while (true)
{
hPipe = CreateFile(
FULL_PIPE_NAME, // Pipe name
GENERIC_READ | GENERIC_WRITE, // Read and write access
0, // No sharing
NULL, // Default security attributes
OPEN_ALWAYS, // Opens existing pipe
0, // Default attributes
NULL // No template file
);
// If the pipe handle is opened successfully ...
if (hPipe != INVALID_HANDLE_VALUE)
{
GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Green, FString::Printf(TEXT("The named pipe %d is connected."), FULL_PIPE_NAME));
break;
}
dwError = GetLastError();
// Exit if an error other than ERROR_PIPE_BUSY occurs.
if (ERROR_PIPE_BUSY != dwError)
{
GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Red, FString::Printf(TEXT("Unable to open named pipe ------ %d"),dwError));
goto Cleanup;
}
// All pipe instances are busy, so wait for 5 seconds.
if (!WaitNamedPipe(FULL_PIPE_NAME, 5000))
{
dwError = GetLastError();
GEngine->AddOnScreenDebugMessage(-1, 3.f, FColor::Red, FString::Printf(TEXT("Could not open pipe: 5 second wait timed out. %d"),dwError));
**THE 121 ERROR OCCURED HERE^^**
goto Cleanup;
}
}
可能是管道设置有问题吗?我不明白为什么它几乎一直有效,但有时没有明确的原因为什么或何时
提前谢谢你的帮助 好的,我想我已经解决了这个问题,也许不是用最好的方法,但它似乎对我的目的来说已经足够好了 在设法重现这个问题之后,我开始考虑把手可以是打开的,也可以是忙碌的(多亏了Karsten!!)。我可以通过使用windows powershell并运行\.\pipe\name(其中name是管道名称)使游戏显示121错误。这将打开管道,游戏无法再连接,显示错误121 我如何“修复”它:当一秒钟后没有连接时重新创建管道。通常在我的应用程序中,当服务器连接时,客户端已经准备好了。因此,应立即进行连接。如果没有,现在管道将在一秒钟后重新创建,然后它将工作。当然,这不是一个干净的修复,但我不知道如何处理正常可以打开,因为通常情况下,唯一的应用程序试图连接到管道是游戏 但无论如何,这是一个体面的工作,在30倍的问题发生(仍然)一些奇怪的原因
如果您还有其他想法,我们将不胜感激,但我认为这目前正在起作用:)因此在错误情况下,管道忙,并且
WaitNamedPipe
在5秒后超时?或者是来自CreateFile
的错误121?是的,该错误发生在客户端的if语句中:if(!WaitNamedPipe(FULL_PIPE_NAME,5000))是否在重新启动客户端后立即发生?也许还有一些失效的过程,保持手柄打开。嗯,我不确定,我以为它发生在5秒钟后,但我还没有检查,我可以尝试复制它,看看这是否是caseHi Karsten,昨天我似乎无法复制,但今天我可以。是的,它确实立即发生,尽管它说它超时了。。它在尝试连接后立即返回121错误。是否有办法检查手柄是否打开以及为什么打开。这是什么原因造成的?