簡體   English   中英

Windows命名管道無法正確響應並發請求

[英]Windows named pipe doesn't respond correctly for concurrent requests

我使用命名管道在一個程序內部進行內部通信(在Windows XP上)。 當我連接2-3個客戶端時,命名管道可以很好地用於多個連接。 但是,當我同時應用多個連接時(例如10),它似乎被卡住了,ConnectNamedPipe()只能接受幾個連接,並且通信似乎被卡住了。

但是,當我調試客戶端代碼時,我發現所有客戶端CreateFile函數均正確返回了文件句柄(似乎是正確的)。 自從我觀看了CreateNamedPipe循環以來,它很混亂,它僅創建了大約一半的句柄...

服務器部分:

       while (!isPipeServerClosed)
        {
            try
            {
                filehandle = CreateNamedPipe(
                this.pipeName,
                DUPLEX | FILE_FLAG_OVERLAPPED,
                PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE,
                255,
                InBufferSize,
                InBufferSize,
                0,
                IntPtr.Zero);
                if (ConnectNamedPipe(filehandle, IntPtr.Zero) > 0)
                {

                    PipeThread pipe = new PipeThread(filehandle);
                    sPipeThreadList.Add(pipe);
                }
            }
            catch (Exception exp)
            {
                System.Console.WriteLine(exp.StackTrace);
            }

        }

客戶端部分,簡單的Delphi代碼(即使我嘗試使用WaitNamedPipe時也具有相同的功能):

  FHandle := INVALID_HANDLE_VALUE;
  FHandle := CreateFile(PChar(FPipeName),GENERIC_READ or GENERIC_WRITE,
        0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
  // create the class
  if FHandle = INVALID_HANDLE_VALUE then
  begin
    Connected := false;
  end

我能知道我想念什么嗎? 謝謝!

您沒有正確使用重疊操作。 特別是

如果使用FILE_FLAG_OVERLAPPED打開了hNamedPipe,則lpOverlapped參數不能為NULL。 它必須指向有效的OVERLAPPED結構。 如果使用FILE_FLAG_OVERLAPPED打開了hNamedPipe並且lpOverlapped為NULL,則該函數可能會錯誤地報告連接操作已完成。

另外,我想有時您的ConnectNamedPipe調用會返回錯誤,因為客戶端尚未連接(ERROR_IO_PENDING)。 在這些情況下,您的客戶端在連接完成后將被“孤立”,因為您不會為它們創建PipeThread

如果要使用重疊模式,則應進行更多研究並正確實施它。 另外,如果您從CreateNamedPipe的參數中刪除FILE_FLAG_OVERLAPPED,則ConnectNamedPipe將阻塞,直到客戶端連接為止,並且不會發生此問題,盡管您將遇到另一個問題:如何在停止服務器時取消阻塞(您可以可以在IIRC上找到一些答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM