問題タブ [namedpipeserverstream]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
3489 参照

c# - NamedPipeServerStream.BeginWaitForConnection が System.IO.Exception で失敗する: パイプが閉じられています

私は単純な非同期 NamedPipeStreamServer プロセスを C# で作成しました。その核心は次のとおりです。

そのための簡単なクライアントも作成しました。クライアント (非同期ではない) は、パイプを開いて終了するだけです。

サーバーを起動してから、1 つまたは複数のクライアントを起動すると、すべて正常に動作しているように見えます。

サーバーを起動せずにクライアントを起動すると、クライアントはサーバーを起動するまで Connect() 呼び出しでハングしますが、その後サーバーを起動すると、BeginWaitForConnection( の System.IO.Exception でサーバーがクラッシュします。 )「パイプが閉じられています」と言って呼び出します。

BeginWaitForConnection() で「パイプが閉じられています」というエラーが発生している他の人を見つけましたが、それらはすべて、同じ NamedPipeServerStream インスタンスで 2 回目の BeginWaitForConnection() 呼び出しを試行したことが原因です。それはここで起こっていることではありません - 私は BeginWaitForConnection() 呼び出しごとに異なる NamedPipeServerStream インスタンスを作成します。

私は何か間違ったことをしていますか?それとも、これは正常なことですか? サーバーの起動を待機している名前付きパイプ クライアントは、サーバーの最初の BeginWaitForConnection() 呼び出しで「パイプが閉じられています」というメッセージを表示しますか?

再試行すると、つまり、例外を吸収して別の BeginWaitForConnection() を実行すると、サーバーが起動するのを待っていたすべてのクライアントに対して 1 つの例外が発生することに気付きましたが、それらすべてを処理した後、その後、サーバーは正常に動作しているようです。

編集:これがHandleConnectionメソッドですが、このコードにさえ当たらないと思います:

0 投票する
0 に答える
299 参照

c# - 名前付きパイプ: アプリ起動後の最初のデータ転送が非常に遅い

クライアントとサーバー アプリケーションがあり、シリアル化された小さなオブジェクトをクライアントからサーバーに名前付きパイプ経由で送信したいと考えています。最初の転送を除けば、非常にうまく機能します。アプリケーションを起動してから毎回最大2秒かかります。次の転送はほぼ瞬時に行われます。

ここに私のサーバーコードがあります:

そして、ここにクライアントがあります:

転送されるデータは一種の証券取引所の注文であり、これも非常に時間に敏感です。そのため、私にとっては、最初の注文も遅延なく機能することが重要です。

名前付きパイプの最初の使用を他のものと同じくらい速くする他の方法はありますか? ある種のプリコンパイル?

追加のスレッドが接続を確立できるかどうかをチェックし、遅延を引き起こすそれぞれのオブジェクトを「ウォームアップ」するためにx秒ごとにダミーデータを送信することを本当に避けたいです。

(ところで:コードは私からのものではありません。ここから入手しました!)

0 投票する
1 に答える
1720 参照

c# - クライアント プロセスの実行可能パスの取得中にアクセス拒否エラーが発生する

名前付きパイプを使用する Windows サービスとしてホストされる WCF サービスに取り組んでいます - NamedPipeServerStream (ユーザー特権) を使用して、サーバーとクライアント プロセス間の安全な接続を確立します。クライアント プロセスの信頼性を確認するには、クライアント プロセスの実行可能ファイルのデジタル署名を検証する必要があるため、プロセス ID を使用してクライアントの実行可能パスを取得しようとしています。

開発にはWindows 7 Professional SP1 (64 ビット) OSVisual Studio 2015 Community Editionを使用しています。サーバー (Windows サービス) とクライアント プロセス (他の exe) の両方がリリース x64モードでのみビルドされます。

一部のクライアント プロセスがサーバーに接続されている場合、クライアント プロセスの exe パスを取得しようとしていますが、次のコード行で「アクセスが拒否されました」というエラーがスローされます。

return Process.GetProcessById(processId).MainModule.FileName;

したがって、この問題を解決するために、私はグーグルで検索し、以下で説明するように他のいくつかの実験的試行を試みましたが、これもうまくいかないようです.

実験的試行

  1. クエリ アクセス権でクライアント プロセス ハンドルを取得しようとしましたが、失敗しました --> 常に 0 を返し、最後の Win32 エラーは 5 (アクセスが拒否されました)として返されます

OpenProcess(ProcessAccessFlags.PROCESS_QUERY_INFORMATION, false, processId);

  1. 限られたクエリ アクセス権限でクライアント プロセス ハンドルを取得しようとしましたが、失敗しました --> 常に 0 を返し、最後の Win32 エラーは 5 (アクセスが拒否されました)として返されます

OpenProcess(ProcessAccessFlags.PROCESS_QUERY_LIMITED_INFORMATION, false, processId);

  1. SeDebugPrivilege を設定し、限られたクエリ権限でクライアント プロセス ハンドルの取得に進みましたが、失敗しました --> SeDebugPrivilege は有効になっていますが、プロセス ハンドルに対して 0 を返し、最後の Win32 エラーは 5 ( Access Denied ) として返されます。
  2. app.manifest ファイル (requireAdministrator 属性) を使用して Windows サービスに管理者権限を設定しようとしましたが、失敗しました -->アクセスが拒否されました
  3. ManagementObject を使用してプロセス情報プロパティを取得しようとしましたが失敗しました --> オブジェクト参照がオブジェクトのインスタンスに設定されていません
  4. Windows サービスのログオン アカウントを「Local Service」から「Local System」に変更しましたが失敗しました

ただし、サンプルの Windows コンソール アプリケーションで上記のすべての方法を試しましたが、エラーは発生せずに正常に動作しており、Windows サービスでは同じことが機能していません。また、コンソール アプリケーションを dll に変換し、サーバーで参照してクライアント プロセス情報を取得しようとしましたが、失敗しました --> 再びアクセスが拒否されました

私は何が起こっているのか、そしてそれを解決する方法について完全に無知です。あなたの提案は本当に役に立ちます。

編集:以下のように、OpenProcess と ProcessAccessFlags のコード スニペットを見つけてください。

NativeMethods.cs