問題タブ [unix-socket]
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.
sockets - プロセスがUnixドメインソケットにバインドされているかどうかを知る方法は?
Linux用のUnixドメインソケットサーバーを書いています。
私がすぐに気付いたUnixドメインソケットの特徴は、リスニングUnixソケットを作成すると、一致するファイルシステムエントリが作成されますが、ソケットを閉じても削除されないことです。さらに、ファイルシステムエントリが手動で削除されるbind()
まで、同じパスに再度ソケットすることはできません。指定されたパスがファイルシステムにすでに存在する場合はbind()
失敗します。EADDRINUSE
結果として、サーバーの再起動unlink()
を回避するために、サーバーのシャットダウン時にソケットのファイルシステムエントリを'edする必要がありEADDRINUSE
ます。ただし、これは常に実行できるとは限りません(つまり、サーバーのクラッシュ)。私が見つけたほとんどのFAQ、フォーラムの投稿、Q&A Webサイトは、回避策として、unlink()
を呼び出す前にソケットにアドバイスするだけbind()
です。ただし、この場合、プロセスを実行する前に、プロセスがこのソケットにバインドされているかどうかを知ることが望ましくなりますunlink()
。
実際、unlink()
プロセスがまだバインドされている間にUnixソケットを作成してから、リスニングソケットを再作成しても、エラーは発生しません。ただし、その結果、古いサーバープロセスはまだ実行されていますが、到達できません。古いリスニングソケットは、新しいリッスンソケットによって「マスク」されます。この動作は避ける必要があります。
理想的には、Unixドメインソケットを使用して、ソケットAPIは、TCPまたはUDPソケットをバインドするときに公開されるのと同じ「相互排除」動作を公開する必要があります。「ソケットSをアドレスAにバインドしたい。プロセスがすでにこのアドレスにバインドされている場合、ただ文句を言う! "残念ながらこれはそうではありません...
この「相互排除」動作を強制する方法はありますか?または、ファイルシステムパスが与えられた場合、ソケットAPIを介して、システム上のプロセスにこのパスにバインドされたUnixドメインソケットがあるかどうかを知る方法はありますか?ソケットAPIの外部で同期プリミティブを使用する必要がありますか(flock()
、...)?それとも私は何かが足りないのですか?
あなたの提案をありがとう。
注:Linuxの抽象名前空間Unixソケットは、へのファイルシステムエントリがないため、この問題を解決しているようですunlink()
。ただし、私が作成しているサーバーは汎用を目的としています。リスニングアドレスの選択については責任を負わないため、両方のタイプのUnixドメインソケットに対して堅牢である必要があります。
sockets - Unix ドメイン (AF_UNIX) ソケットのエンドポイント (ファイル) をどこに置くか?
Unix ドメイン ソケットへのエンド ポイントを表す「ファイル」を配置する規則はありますか?
に置きがち/tmp/some-application-specific-subdir-name/
ですが、もっと一般的な場所があるのではないでしょうか。
背景は、そのような「ファイル」にアクセスするための最大パス長についてPOSIXが明確ではないということです。
sun_path のサイズは、意図的に未定義のままになっています。これは、異なる実装が異なるサイズを使用するためです。たとえば、4.3 BSD はサイズ 108 を使用し、4.4 BSD はサイズ 104 を使用します。ほとんどの実装は BSD バージョンに由来するため、サイズは通常 92 から 108 の範囲です。
アプリケーションは、sun_path に特定の長さを想定したり、{_POSIX_PATH_MAX} バイト (256) を保持できると想定したりしないでください。
したがって、パスの長さに関するこの「制限」は、アプリケーションのファイル/パス名の構成から除外する必要があります。
linux - Unixドメインソケットに接続するプログラムを特定する
Unixドメインソケットをリッスンしているプログラムがあります。
クライアントがソケットに接続するときに、接続されているプログラムを確認し、接続を許可するかどうかを決定します(ユーザー/グループの設定に基づいて)。
これはLinuxで可能ですか?もしそうなら、どのように?
linux - ディスク上のUNIXソケットファイルとubuntu上のtmpfs
tmpfs/ramdisk (ubuntu) ではなくディスクに unix ソケット ファイルを配置すると、速度に違いはありますか?
java - セレクターを使用した非ブロッキング モードでの Unix ドメイン ソケットでの Java NIO の使用
Java NIO で Unix ドメインソケットを使用する方法はありますか? 単一のスレッドでセレクターを使用できるように、NIO を使用したいと考えています。
junixsocketを見てみましたが、セレクターをサポートする NIO チャネルではなく、通常のソケットのみをサポートしているようです。
ruby - Ruby で IPC を高速化する
Ruby の同じ Linux ボックスで 2 つのプロセス間で IPC を実行しようとしていますが、可能な限りソリューションを最適化する必要があります。
私は TCPSocket から始めましたが、UNIXSocket を使用する方がおそらく高速であり、データをカーネル バッファーにコピーしないことがわかります。
私はSOスレッドを読んでいますが、mmapを見るのは面白いかもしれません。ただし、mmap の場合は、a) mmap gem をインストールし、b) ロックを提供する必要があります。これは、複数のクライアント プロセスがサーバー プロセスに接続しようとする可能性があるためです (両方とも同じボックスで実行されます)。
私の質問:
- 他にどのようなオプションをお勧めしますか?
- ruby mmap でメモリをロックする方法をお勧めしますか?
- 利用可能な場合、UNIXSocket と mmap の数値はどのように積み重なるのでしょうか?
sockets - NGINXpost_actionからUNIXドメインソケットへ
すべてのnginxトラフィックをUnixソケットに送信(コピー)しようとしています。
これが私のnginx.confからの関連コードです
このソケットでサーバーを起動する必要がありますか?
これを行うと、ソケットに要求が来るのを見ることができません。
さらに、構成のために、私のnginxは1つのリクエストでテストしている間だけ50〜90%の巨大なCPUを使用しています。
-
編集:
私の間違いですが、sockファイルはNGINXワーカープロセスで書き込めませんでした。適切な権限を与えました。
CPU使用率が高い理由は、POST_ACTIONタグが内部リダイレクトされたためです。
他の誰かがPOST_ACTIONで内部リダイレクトの問題に直面した場合、私はその場所から444を返すことで解決しました。私の場合、これは機能します。
ありがとう。
c++ - asio unix ソケットの再利用を促進
プログラムで「ワーカー スレッドごとの各 io_service」設計を使用したいと考えています。しかし、UNIXソケットを再利用することはできません:
「アドレスは既に使用されています」で失敗します。asio/basic_socket_acceptor.hpp (ブースト 1.46.1) を開くと、アクセプターのコンストラクターの説明が表示されます。
このコンストラクターはアクセプターを作成し、それを自動的に開き、指定されたエンドポイントで新しい接続をリッスンします。
@param reuse_addr コンストラクターがソケット オプション socket_base::reuse_address を設定する必要があるかどうか。
これはブースト asio のバグであり、バグトラッカーに送信する必要があります。よろしいですか?
sockets - UNIX ソケット: クライアントは別のクライアント向けのデータを読み取ることができますか?
UNIX ソケットを IPC メカニズムとして使用して、複数のクライアント プロセスがサーバー プロセスに接続しているとします。
各クライアント コードは無限ループで実行され、ソケットとの間でデータを読み書きしようとします。
私の質問: クライアントは、他のプロセスによって読み取られることを意図したデータを読み取っていないことをどのように知ることができますか? サーバー プロセスは単一のソケットにデータを書き込んでいますね。
TCP/IP の場合、この質問は意味がありません。ソケットはタプルを意味する<remote host, remote port, local host, local port, protocol>
ため、サーバーにアクセスしようとして別のマシンで実行されているプロセスは、互いのデータを読み取ることができません。
しかし、UNIX ソケットの場合は単なるファイルですよね? または、何か不足していますか?
haskell - HaskelのクライアントとしてUnixドメインソケットに接続します
HaskellでUnixドメインソケットを扱うための良い情報を見つけることができません。ソケットを開いてコマンドを書き込むための簡単な関数が必要です。誰かがこれについてどこを読むべきか、あるいは例を挙げてくれるアドバイスを手伝ってくれますか?
基本的に、私はこの単純なRuby関数を移植する必要があります(私が何を意味するのかを理解するのに役立つ場合):
ソケットを開き、成功するとtrueを返すコマンドを書き込みます。ありがとうございました。