命名管道有时不';行不通 我写了一个C++应用程序,它通过命名管道连接到一个不真实的引擎4游戏。95%的时间它工作正常,但有时它似乎连接不好。这是非常随机的,所以我很难找到导致这种情况的问题。服务器是在我的应用程序中创建的,客户端是在UE4游戏中创建的。有时UE4游戏无法连接并显示错误121: // // MessageId: ERROR_SEM_TIMEOUT // // MessageText: // // The semaphore timeout period has expired. // #define ERROR_SEM_TIMEOUT 121L

命名管道有时不';行不通 我写了一个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

正如我所说,问题是随机发生的,我似乎找不到导致问题的具体原因。管道已成功创建,我可以在windows powershell中看到这一点(get childitem\。\pipe)

我在想也许我使用的管道设置有问题

这是我创建管道服务器的代码:

    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错误。是否有办法检查手柄是否打开以及为什么打开。这是什么原因造成的?