問題タブ [gen-tcp]
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 - Erlang gen_tcp:recv ソケットのクローズ
私は websockets と MQTT を使用してプロジェクトに取り組んでいます。Websocket サーバーは mqtt から 4 つのメッセージを受信し、他のメッセージを受信するためにループさせました。ただし、メッセージがない場合は、Encoded_fixed_header = gen_tcp:recv(Socket, 0)
受信するメッセージがないため、エラーを返します。gen_tcp:recv について調査したところ、メッセージを無限に待つと言われていますが、そうではないようで、ソケットを閉じます。
何が問題なのですか?
sockets - 未知の長さの文字列を受け取りましたか?
というわけで、書いた Python プログラムを Erlang に変換していて、Erlang を使うのは久しぶりです。だから私は初心者レベルに戻ります。とにかく経験から、ソケットを扱うときに使用するすべての言語には、送受信されるデータの長さを常に返す send/recv 関数があります。ただし、Erlangs gen_tcp の場合はそうではないようです。
send/recv/or inet:setopts を呼び出すと、パケットがいつ終了したかがわかりますか? 受信したいパケット (文字列) でエスケープまたは \n を見つけることができるように、ループする recvAll/sendAll 関数を記述する必要がありますか?
http://erlang.org/doc/man/gen_tcp.html#recv-2
私が使用しているコード例:
例とドキュメンテーションを見るだけで、Erlang は知っているように見えます。クライアントは私が書いているPHPソケットライブラリであるため、受信されるデータの長さは20バイトから9216バイトまでの範囲であり、チャンクで送信される可能性があるため、確認したいと思います。
ありがとうございました、
アジム。
sockets - Erlang で RPC 経由でリモート ノードにソケットを作成すると、ソケットで接続を受け入れることができません
gen_tcp:accept が常に {error, closed} 応答を返す理由を特定するのに苦労しています。
基本的に、リッスン ソケットを作成するスーパーバイザがあります。
このソケットは、gen_server 動作の実装である子に渡されます。次に、子はソケットで接続を受け入れます。
スーパーバイザーと gen_server の BEAM バイナリをローカルにロードし、code:load_binary への RPC 呼び出しを介して別のノード (同じマシン上で実行) にロードします。次に、RPC 呼び出しを介してスーパーバイザーを実行します。これにより、サーバーが起動します。{error, closed} は、このシナリオでは常に gen_tcp:accept によって返されます。
ノード シェルにログインしているときにスーパーバイザとサーバを実行すると、サーバは問題なく接続を受け入れることができます。これには、接続を受け入れることができないリモート ノードへの「remsh」が含まれます。
シェルのみを使用して問題を再現できるようです。
最終 RPC への応答は {error, closed} です。
これは、ソケット/ポートの所有権と関係がありますか?
参考までに、接続を待機しているクライアントはなく、タイムアウトはどこにも設定していません。
erlang - gen_server ソケット上の Gen_tcp リッスンはすぐに閉じられます
gen_server で gen_tcp を使用したいのですが、コードは次のとおりです。
さて、tcp_listener
は の直前waitConnetion
で閉まっていますが、その理由がよくわかりません。
handle_cast
コードを init セクションに移動すると、正しく動作します。
接続が閉じられているのはなぜですか? 私は成功せずに多くの時間を費やしています。
どんな助けでも大歓迎です。
編集:
リスナーの後にキャスト コードを移動すると、次のようになります。
私が投稿したコード:
erlang - Erlang TCP ソケットが閉じられる
Erlang を学ぶために、.NET ベースの小さな Web サーバーを実装しようとしていますgen_tcp
。残念ながら、私のコードは有線の動作を引き起こしているようです。問題を実証するために、問題を再現するのに十分な実装の最小化バージョンを添付しました。HTTP リクエストが何であれ、静的な 200 OK を配信しているだけです。
ab
Web サーバーに対して (ループバック インターフェイスを使用して) (Apache HTTP サーバーのベンチマーク)を実行しようとすると、問題が発生します。同時リクエスト ( -c
) がなければ、すべてが正常に実行されます。ただし、-c 8
またはを使用すると、シェルに多数の行が表示されるため、一部のソケットでへ-c 16
の呼び出しが失敗するようです。gen_tcp:accept/1
request: closed
話全体をさらに奇妙にしているのは、さまざまなオペレーティング システムでさまざまな動作が見られることです。
- OS X+Erlang/OTP 18:
ab
起動直後に「接続がピアによってリセットされました」と報告されます。 - Debian+Erlang R15B01: 2 つを除くすべての HTTP リクエストが実行されているようです。しかし、その後、
ab
数秒間ハングし、「指定されたタイムアウトが期限切れになりました。合計 4998 の要求が完了しました」と報告ab
し-n 5000
ます。同様に、15000 回のテストを実行すると 14998 が報告されます。
これは問題ではないようです。私は正直なところかなり迷っているので、助けていただければ幸いです!:) ありがとう!
sockets - Erlang は 100 万のクライアントを同時に接続します
問題があります: 1M の同時オープン TCP 接続を保持できる Erlang サーバーを作成したいと考えています。OS (Oracle Linux 7) を調整して、ファイル記述子を上げました。サーバー上で gen_tcp:listen を実行します
// point_1
Socket = gen_tcp:accept
spawn(handle(Socket)) //
point_1 に戻る別のスレッド
順番に接続しても問題ありません。100 秒で 100K クライアントを接続しました。しかし、私はそれ以上の忍耐がありませんでした。
それらを同時に接続したい場合、たとえば、100から約80の接続しか作成されません。
これは私がすべてを実行する方法です:
// ポート 9999 でリッスンする 1 つのサーバーを起動します
// 100 クライアントがポート 9999 で接続を試みます
いくつかのコードをお見せしましょう: