問題タブ [erlang-ports]
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.
erlang - 一部のUNIXマシンでErlang-Cポートが機能しない
チュートリアルhttp://www.erlang.org/doc/tutorial/c_port.html#id63121およびJoeArmstrongの本で説明されているように、標準のerlang-cポートコードを使用しています。
私のMacBookでは、erlangコードとcコードはwrite_exactとread_exactを使用して正常に通信します。(私はその標準コードのいずれにも触れていません)。
しかし、UNIX pdpマシンでまったく同じコードを実行すると、cからerlangへの通信が切断されます。具体的には、サーバーのループでは次のようになります。
cコードはerlangコードからエンコードされたメッセージを正常に受信します。次に、cコードはwrite_exactを使用して応答を書き戻します(この場合、2バイトのヘッダーを持つ非常に単純なOK応答)。しかし、erlangコードがこのメッセージを受け取ることはありません。上記のループ関数は、{Port、{data、Data}}..を受信しません。
応答を書き込むためのcコードは、標準コード(write_cmdおよびwrite_exact)です。私はこの標準コードのいずれにも触れていません:
c側をデバッグすると、write()関数が呼び出されますが、どういうわけか、erlang側はポートからメッセージを受信しません。
このマシンでこのメッセージがcからerlangに戻らない原因が何か考えがあることをご存知ですか?(これはMacBookで動作し、まったく同じpdpマシンで動作していました。最後に動作してからerlangコードには触れていません)。write_exactへの書き込みが実際に何かを書き込むのを妨げる、アクセス許可などと関係があるのでしょうか。私は途方に暮れています。
c++ - Erlang と C/C++ の統合状況は?
公式ドキュメントを確認すると、 Erlang と C/C++ を接続するさまざまな方法を見つけることができます。同様の質問が2009 年にここで行われましたが、それ以降、状況がどのように変化したかを知りたいと思います。
Erlang と C の間でバイナリ プロトコルを実装するという厄介な作業をすべて行う成熟した安定したライブラリはありますか? それはei
それとも、それらの違いerl_interface
は何ですか?
これは非常に一般的な問題のようです。誰かがすでに問題を解決しており、Erlang Port Driver を独自に作成する必要がなくなったことを願っています。そのほとんどは一般的なコードだからです。
PS私はこのライブラリも見つけました:EPAPI。
c - CとErlang:Erlangポートの例
免責事項:質問の作成者は、アーランの平均的な知識とCの基本的な知識を持っています。
現在、相互運用性チュートリアルのユーザーガイドを読んでいます。例を正常にコンパイルしましたcomplex.c
が、Erlangポートで問題なく動作します。
ただし、実際のCコードがどのように機能するかを理解したいと思います。私はそれを一般的に理解しています。この例では、標準入力から2バイトを読み取り、最初のバイトをチェックします。最初のバイトに応じて、foo
またはbar
関数を呼び出します。これが今の私の理解の限界です。
したがって、両方を取る場合erl_comm.c
:
およびport.c
:
各関数は実際にそこで何をしますか?li, len, i, wrote, got
変数は実際にどのような目的を果たしますか?
さらに小さな質問:
- なぜ関数は
void
sでさえも戻り型を持たないのですか? - ErlangポートがCにデータを送信するとき、最初のバイトが呼び出される関数を決定します。バイトが10進数の1を保持している場合は、
foo()
が呼び出され、バイトが10進数の2を保持している場合は、bar()
が呼び出されます。とにかく変更されていない場合は、このプロトコルを使用して、それぞれ1つのパラメーターのみで最大255の異なるC関数を呼び出すことができます。そうですか? - 「長さインジケーターの追加はErlangポートによって自動的に行われますが、外部Cプログラムで明示的に行う必要があります」。どういう意味ですか?コードのどの行で実行されますか?
- チュートリアルから:「デフォルトでは、Cプログラムは標準入力(ファイル記述子0)から読み取り、標準出力(ファイル記述子1)に書き込む必要があります。」次に、「stdinとstdoutはバッファリングされた入力/出力用であり、Erlangとの通信には使用しないでください!」ここでのキャッチは何ですか?
- なぜ
buf
に初期化されるの[100]
ですか?
erlang - erlang の inet_addr 機能
質問が言うように、の機能を実行する関数またはモジュールはありますinet_addr
か?
Google からの結果は、直接的な方法を示唆していないか、何か不足していますか?
ありがとう。
erlang - EUnitが.beamファイルを.eunit/ebinにコンパイルするのはなぜですか?
免責事項:この質問の作者は、主にErlang/OTPの理論的知識を持っています。
myapp/ebin
を介してディレクトリ内の非Erlang実行可能ファイルを呼び出す小さなOTPアプリケーションがありますopen_port()
。アプリケーション自体を実行すると、すべてがうまくいき、実行可能ファイルへのポートが正常に開かれます。
しかし、アプリケーションの単体テストを実行しようとすると、open_port()
失敗に依存するものが失敗します。EUnit
これは、アプリケーションを起動したときに、の下で実行可能ファイルを見つけようとするためmyapp/.eunit/ebin
です。
アプリケーション自体のコードを変更せずに、その動作を変更するにはどうすればよいですか?アプリケーション自体を実行するときと同じ現在のディレクトリでEUnitテストを実行するにはどうすればよいですか?(つまり、EUnitを実行できるようにするためだけに、実行可能ファイルへのパスを提供するコードを変更することはお勧めできません)。
編集:Erlangメーリングリストのアドバイスに従いましたが、をcode:priv_dir(myapp_name)
返します{error, bad_name}
。
編集:ファイルが含まれていて、ファイルとファイルの両方が.eunit/
含まれていることがわかります。今、私は完全に迷子になっています。を実行すると、コマンドを実行します。このコマンドは、ディレクトリ内の対応するファイルを呼び出すディレクトリ内の各ファイルを呼び出します(ファイルがテスト中に実行されたことを明確に示しています)。なんでそうなの?なぜ代わりにディレクトリからファイルを実行する必要があるのですか?modulename.beam
ebin/
modulename.beam
modulename_tests.beam
make test
rebar
eunit
modulename_tests.beam
ebin/
modulename.beam
.eunit/
filename:absname("")
modulename.beam
.eunit/
modulename.beam
.eunit/
ebin/
myapp/ebin
とにまったく同じ.beamファイルが必要なのはなぜmyapp/.eunit/ebin
ですか?
PS公式ドキュメントを読みましたが、解決策が見つかりませんでした。
c++ - erlangポートを介したqtアプリケーションとerlangサーバー間の通信
ubuntu でクライアント (qt c++) とサーバー (erlang) を作成する必要があります。サーバーは汎用 OTP サーバーである必要があります。クライアントはサーバーに接続して何らかのデータ (文字列) を送信し、erlang srv は同じ文字列を返す必要があります。
これを実装するためのサンプルコードまたはスケルトンを提案してください。
私はこれから始めることにしました:
クライアントとサーバーについて教えてください。
erlang - erlang ポートのポート情報が未定義に変更される可能性はありますか?
私は erlang サーバーを取得しましたが、多くのクライアントが tcp を使用してサーバーに接続しています。
数分後、erlang:ports() と erlang:port_info() を使用すると、いくつかのポートの port_info が定義されておらず、ポートが閉じられていることがわかります。いずれにせよ、ポートからそれを削除する方法が見つかりません。
では、なぜそうなったのでしょうか? これらの未定義のポートを erlang ポートから削除するにはどうすればよいでしょうか?
erlang - Erlang:Tcpサーバー
こんにちは私はErlangの新しい蜂ですが、パッシブモードでクライアントを受け入れてメッセージを表示する単純なTCPサーバーを作成することができました。新しいクライアントがサーバーに接続するたびに、新しいプロセスを生成します。クライアントが接続したときに生成されるプロセスを使用して、クライアントにメッセージを送信する方法はありますか?
これがコードです。
私がそうするようなものを私は持つことができますか?
Pid!{"Some Message"}
。そして、メッセージは、非ブロッキングioを使用してプロセスに関連付けられたソケットに送信されます。
functional-programming - ユーザーがユーザー名/ニックネーム/参加者のみを提供し、JID全体を提供していないかどうかを知る方法(Ejabberd)
モジュールをカスタマイズmod_muc_room
していますが、ユーザーがオンラインであるかどうかを認識し、ユーザー名のみを提供する関数を追加したいと思います。モジュールで私は関数を見つけることができますis_user_online
:
ユーザー名、サーバー、リソースを提供する必要があることを理解しています。LJID、次のような結果になります{"user", "myserver.com, "someid"}
同じものを返すが、「ユーザー」のみを提供する関数を追加したいのですが、
これを達成する方法についてアドバイスをいただけますか?