問題タブ [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.
c - ソケットの反対側が受け入れられたかどうかを確認する方法は?
クライアント/サーバーをセットアップしており、サーバーが接続を受け入れたかどうかをクライアントに知らせたいです。そうでなければ、私のクライアントは、それがまだ受け入れられるのを待っているという手がかりがありません. これを確認するために、さらなる通信 (プロトコル仕様) に頼ることはできません。したがって、たとえば、サーバーからクライアントに「Good to go」文字列を送信することはできません。サーバーが実際に受信しているかどうかを確認できるフラグまたは何かがありますか? いくつかのサンプル コードは次のとおりです。
perl - Perl で IO::Async::Loop イベントから IO::Async::Listener (またはその通知機能) オブジェクトを削除する方法
IO::Socket::UNIX を使用して UNIX ドメイン ソケットを作成し、それを IO::Async::Listener のインスタンスに渡して、ソケットでのリッスンとデータ受信時の通知を処理するコードがあります。次に、IO::Async::Listener が IO::Async::Loop イベント ループ インスタンスに追加されます。もちろん、ソケットは制御されたマネージャーで動的に作成されます。
特定の条件で、イベントループからソケットを削除したい (完全に削除するか、可能であれば他の条件で一時的に無効にする) 方法がわかりません。
IO::Async::Loop は $loop->remove( $notifier ) を介してイベントループから IO::Async::Notifier オブジェクトを削除することを提案しますが、notifier の作成は IO::Async::Listener によって内部的に処理されました (IO を介して) ::Async::Stream だと思いますか?)。スクリプトの Ctrl-C でも、ソケット ファイルは削除されません。手動close $socket and unlink( $path )
でソケット ファイルを削除する必要がありますか?
望ましい動作の抽象コードは次のとおりです。
sql - 非同期サーバー、コールバック待機中の切断の処理
非同期サーバー管理について質問があります。私はlibevent2と(私自身の学習経験のために)プレーンなANSI Cを使用しています。apache2ユーティリティのabでストレステストを行います。ほとんど-n 10000
と-c 400
。私のデータベースは、ローカル ネットワーク内の debian コンピューター上の SQL サーバーです。そのため、接続はかなり高速です。valgrind も使用してアプリをプロファイリングします ( --leak-check=full --show-reachable=yes
)
私は今、1つの問題を抱えています。SQLデータベースへの同期呼び出しを行うと、すべてが正常に機能します。ただし、すべてメイン スレッドで実行されるため、新しいクライアントがデータを受信するまでに時間がかかります (ストレスが発生している間)。SQLデータベースへの非同期呼び出しを行うと、SQL呼び出しが戻る前にクライアントが切断されない限り、すべてがうまく機能します。SQL呼び出しが戻り、クライアントがすでに切断されているとすぐに、バッファがすでに解放されている、ソケットが閉じられているなどの理由で、無効な読み取りエラーがたくさん発生します。すでにさまざまなことを試しましたが、できませんでした。適切な解決策が得られません。
一般的に、このようなものをどのように扱っているかお聞きしたかっただけです。たとえば、接続されているすべてのクライアントを含む BST を保持し、非同期呼び出しが返されたときにそれを検索しますか? まだそこにある場合は、コールバックを実行します。それ以外の場合は破棄しますか? これにより、パフォーマンスがかなり低下する可能性があると思います。ソケットがまだ開いているかどうかも確認しようとしましたが、ちょっと変でした。
recv(fd, buffer, 1, MSG_PEEK)
常にreturned -1
(オープンおよびクローズされたノンブロッキング ソケット上で)。
さて、私がすでに行ったことを説明するのはちょっと難しいので、皆さんが答えてくれるのを待ちます:-)
こんにちはマルクス
更新:接続ごとにミューテックスを使用するというクレイジーなアイデアがありました。非同期呼び出しに入ると、それをロックし、戻った後に解放します.. :-)しかし、私はこの方法を信頼していません..正しく聞こえません..誰もそのアプローチを推奨できますか?
更新 2: 私は自分のアイデアを試してみましたが、うまくいきました。それを正しくするのは少しトリッキーでしたが、ロックはそれをしました
c++ - C / UnixのIPサブネットでリッスンするソケット
Cでサーバークライアントソケットプログラムを作成しようとしています。目的は、サーバーが特定のポートでリッスンすることですが、同じIPサブネットに属するIPアドレスの範囲にわたっています。この IP サブネットは127.xxx範囲の一部です (もちろん 127.0.0.1 ではありません)。
いくつかの注意点:
- これはストリームベースのソケットであり、Datagram ソケットではありません。
- これはブロードキャスト アドレスではありません。
- Unix/Linux プラットフォームでのみ C/C++ で実装
範囲内の各 IP アドレスに対して、サーバー上で複数のソケットを開きたくありません。これはスケーラブルではありません。
どんな助けでも理想的には高く評価されます。これは実現可能ですか?
javascript - Node.js を使用してリアルタイムでファイルを読み取る
node.js を使用して、ファイルに書き込まれているデータをリアルタイムで読み取るための最善の方法を考え出す必要があります。問題は、ノードが動きの速い船であるため、問題に対処するための最善の方法を見つけるのが難しいことです。
やりたい
こと 何かを実行し、その結果をテキスト ファイルに書き込む Java プロセスがあります。通常、実行には 5 分から 5 時間かかり、その間ずっとデータが書き込まれ、かなり高いスループット レート (約 1000 行/秒) に達する可能性があります。
このファイルをリアルタイムで読み取り、ノードを使用してデータを集約し、クライアントでグラフ化できるソケットに書き込みます。
クライアント、グラフ、ソケット、および集計ロジックはすべて完了していますが、ファイルを読み取るための最善の方法について混乱しています。
私が試したこと (または少なくとも遊んだこと)
FIFO
- Java プロセスに fifo に書き込み、ノードを使用してこれを読み取るように指示できます。これは実際、現在 Perl を使用してこれを実装している方法ですが、他のすべてはノードで実行されているためです。コードを移植することは理にかなっています。
Unix Sockets
- 上記のように。
fs.watchFile
-これは必要なものに機能しますか?
fs.createReadStream
-これはwatchFileよりも優れていますか?
fs
& tail -f
- ハックのようです。
実際の
ところ、
Unix ソケットを使用する傾向がある私の質問は何ですか。これが最速のオプションのようです。しかし、ノードには、ファイルを fs からリアルタイムで読み取るためのより優れた組み込み機能がありますか?
c - UNIXソケットの接続数
任意のUNIXソケットアドレスが与えられた場合、POSIX api呼び出しを介して接続数を取得できますか?
または、/ procファイルシステムをウォークスルーする必要がありますか?
c - ファイル記述子の送信中に sendmsg が機能しない
異なるプロセス間で開いているファイル記述子を送信するために、UNIX ドメイン ソケットを使用しています。Unix ドメイン ソケットは正常に動作しますが、sendmsg
ファイル記述子を送信していたときに奇妙なことが起こりました。関数は直後に戻りsendmsg
、sendmsg は何も返しません。そして、recvmsg がInvalid Argument
エラーを出しています。これが私のコードです。
クライアント (ファイル記述子の送信):
サーバー (ファイル記述子を受信):
クライアントの出力:
さえないinside sendmsg condition
とafter sendmsg
印刷されますか?
c - リッスンするためにソケットをコンピューターのアドレスにバインドする
特定のポートで着信接続をリッスンするために、新しいソケットをコンピューターのアドレスにバインドするように設計されたコードを作成しました。getaddrinfo を使用しています。これが最善の方法ですか?ポート整数を文字列に変換するのは無意味に思えます。sprintf を必要とせずにこれを行う方法はありますか?
c++ - Unixドメイン:connect():そのようなファイルやディレクトリはありません
タイトルに記載されているように、それに応じたアドレスを使用してUNIXドメインタイプのソケットをconnect()で呼び出すと、エラーENOENT:no such fileordirectoryが発生します。
2つのソケットは適切に初期化され、それに応じてソケットファイルが作成およびバインドされます。サーバーソケットとクライアントソケットは異なるプロセスで実行されますが、クライアントプロセスはfork()-edとexecl()-edです。これは、クライアントソケットの設定に使用するクライアントソケットとサーバーソケットのアドレスを解析する方法でもあります。サーバープロセスはpthreadを使用しています。
これが私のconnect()の試みです:
次のようなサイズのさまざまな値を試しました。
驚いたことに、最後の1つを除くすべての初期化により、 EINVAL: connect()の無効な引数エラーが発生し、 ENOENT:最後のものだけでそのようなファイルまたはディレクトリが発生しません。私はインターネットからすべての例を試しましたが、成功しませんでした。そして明らかに、socklen_tをsize_tまたはintと交換しても何も変わりません。
私はすでにこれをチェックしました:
- address.sun_pathには、ルートディレクトリから始まる正しいソケットファイルパスが含まれています
- address.sun_pathの長さは61文字です
- address.sun_familyはAF_UNIX/AF_LOCALに設定されています
- address.sun_familyのサイズは2バイトです
- 両方のソケットの作成とバインドでエラーは発生しません
- サーバーソケットはリスニング状態です
- sizeof(address)は、本来あるべき110を返します。
ここで、マニュアルページの例が機能しなかった理由と、linux.die.netまたはwww.kernel.orgで更新されていない変更があったかどうか疑問に思いました。私のOSは、関連するものであればDebianSqueezeです。
私が間違っていることについて何か考えはありますか?そしてそれを解決する方法は?さらにコードが必要な場合や質問がある場合は、遠慮なく私に質問してください(おそらくこれを述べる必要はありませんが、これが私の最初の投稿です>。<)。
ところで、私の悪い英語でごめんなさい
アップデート2
解決しました。わかりやすくするために、以下の追加の回答で投稿します。
linux - Linux の「抽象」UNIX ソケットに接続できません
スレッド間通信に UNIX ソケットを使用しようとしています。このプログラムは、Linux での実行のみを目的としています。ソケット ファイルの作成を避けるために、unix(7) に記載されているように、「抽象的」ソケットを使用したいと考えました。
ただし、これらのソケットに接続できないようです。ただし、「パス名」ソケットを使用している場合はすべて機能します。
コードは次のとおりです (エラー処理については引用していませんが、完了しています): thread#1:
スレッド#2:
上記のコードで、sun_path の先頭に \0 を付けないように変更するだけであれば、問題なく動作します。
トレース出力:
connect が accept の前に来ることはわかっていますが、それは問題ではありません (connect() の前に accept() が呼び出されるようにしましたが、結果は同じです。また、ソケットが「パス名」であれば問題ありません)。