2016-05-29 1 views
0

私は、任意の数のプロセスが名前付きパイプ経由で互いに通信するシステムを実装しようとしています。実装はWindowsのC++で行われます。しかし、プロセスがメッセージを受け取ることができないように見えるので、私は立ち往生しています。私は同様の質問を見つけることができませんでした、私はすでに尋ねられた場合はお詫び申し上げます。とにかく、ハンドルの作成に関連するコードは次のとおりです。アイデアは、n(n =約5または6)のプロセスを持ち、すべてのプロセスに書き込み(pipesIn)と読み取り(pipesOut)の名前付きパイプがあるということです。ConnectNamedPipeを呼び出すときのERROR_INVALID_HANDLE

pipesIn = std::vector<HANDLE *>(); 
    pipesOut = std::vector<HANDLE *>(); 
    this->name = name; 
    wchar_t pipeName[20]; 
    for (int i = 0; i < total; i++) { 
     if (i != name) { 
      HANDLE hIn; 
      swprintf(pipeName, L"\\\\.\\pipe\\Pipe(%d,%d)", name, i); 
      do { 
       hIn = CreateNamedPipe(pipeName, 
        PIPE_ACCESS_DUPLEX | PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, // FILE_FLAG_FIRST_PIPE_INSTANCE is not needed but forces CreateNamedPipe(..) to fail if the pipe already exists... 
        PIPE_WAIT, 
        1, 
        1024 * 16, 
        1024 * 16, 
        NMPWAIT_USE_DEFAULT_WAIT, 
        NULL); 
      } while (hIn == INVALID_HANDLE_VALUE); 
      pipesIn.push_back(&hIn); 
     } 
    } 

    for (int i = 0; i < total; i++) { 
     if (i != name) { 
      HANDLE hOut; 
      swprintf(pipeName, L"\\\\.\\pipe\\Pipe(%d,%d)", i, name); 
      do { 
       hOut = CreateFile(pipeName, 
        GENERIC_READ | GENERIC_WRITE, 
        0, 
        NULL, 
        OPEN_EXISTING, 
        0, 
        NULL); 
      } while (hOut == INVALID_HANDLE_VALUE); 
      pipesOut.push_back(&hOut); 
     } 
     else { 
      pipesIn.push_back(NULL); 
      pipesOut.push_back(NULL); 
     } 
    } 

問題は受信機能にあります。 ConnectNamedPipeを呼び出すと、結果は0になり、GetLastError()はERROR_INVALID_HANDLEを返します。

char response[20]; 
    DWORD dwRead; 

    bool recieved = false; 
    while (!recieved) { 
     bool flag = false; 
     for (int i = 0; i < pipesIn.size(); i++) { 
      if (name == i) { 
       continue; 
      } 
      if (ConnectNamedPipe(pipesIn.at(i), NULL) != FALSE) { 
       while (ReadFile(*(pipesIn.at(i)), response, sizeof(response) - 1, &dwRead, NULL) != FALSE) 
       { 
        response[dwRead] = '\0'; 
        recieved = true; 
        break; 
       } 
      } 
      else { 
       printf("%d\n", GetLastError()); 
      } 
     } 
    } 

私はC++の新機能でパイプを使用しているので、これはあまり意味がありません。私は通信の方法を複製しようとしていたhere。あらゆる種類のアドバイスが役に立つと考えられます。

答えて

2

あなたは不必要に複雑なことによって足に自分自身を撃ったことがあります。

 pipesIn.push_back(&hIn); 

これは問題です。 hInはスコープの終わりに行くスタックローカル変数ですが、スタック上のその場所のアドレスを取得して保存しています。

解決策は、ベクトルをstd::vector<HANDLE>にすることです。ハンドルは最初はポインタと同じ大きさの非常に小さいオブジェクトなので、アドレスでそれらを取ることによってあなた自身に何の恩恵も与えていません。

関連する問題