問題タブ [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.

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

sockets - Erlang gen_tcp:recv ソケットのクローズ

私は websockets と MQTT を使用してプロジェクトに取り組んでいます。Websocket サーバーは mqtt から 4 つのメッセージを受信し、他のメッセージを受信するためにループさせました。ただし、メッセージがない場合は、Encoded_fixed_header = gen_tcp:recv(Socket, 0) 受信するメッセージがないため、エラーを返します。gen_tcp:recv について調査したところ、メッセージを無限に待つと言われていますが、そうではないようで、ソケットを閉じます。

何が問題なのですか?

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

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バイトまでの範囲であり、チャンクで送信される可能性があるため、確認したいと思います。

ありがとうございました、

アジム。

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

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} です。

これは、ソケット/ポートの所有権と関係がありますか?

参考までに、接続を待機しているクライアントはなく、タイムアウトはどこにも設定していません。

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

erlang - gen_server ソケット上の Gen_tcp リッスンはすぐに閉じられます

gen_server で gen_tcp を使用したいのですが、コードは次のとおりです。

さて、tcp_listenerは の直前waitConnetionで閉まっていますが、その理由がよくわかりません。

handle_castコードを init セクションに移動すると、正しく動作します。

接続が閉じられているのはなぜですか? 私は成功せずに多くの時間を費やしています。

どんな助けでも大歓迎です。

編集

リスナーの後にキャスト コードを移動すると、次のようになります。

私が投稿したコード:

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

erlang - Erlang TCP ソケットが閉じられる

Erlang を学ぶために、.NET ベースの小さな Web サーバーを実装しようとしていますgen_tcp。残念ながら、私のコードは有線の動作を引き起こしているようです。問題を実証するために、問題を再現するのに十分な実装の最小化バージョンを添付しました。HTTP リクエストが何であれ、静的な 200 OK を配信しているだけです。

abWeb サーバーに対して (ループバック インターフェイスを使用して) (Apache HTTP サーバーのベンチマーク)を実行しようとすると、問題が発生します。同時リクエスト ( -c) がなければ、すべてが正常に実行されます。ただし、-c 8またはを使用すると、シェルに多数の行が表示されるため、一部のソケットでへ-c 16の呼び出しが失敗するようです。gen_tcp:accept/1request: closed

話全体をさらに奇妙にしているのは、さまざまなオペレーティング システムでさまざまな動作が見られることです。

  • OS X+Erlang/OTP 18:ab起動直後に「接続がピアによってリセットされました」と報告されます。
  • Debian+Erlang R15B01: 2 つを除くすべての HTTP リクエストが実行されているようです。しかし、その後、ab数秒間ハングし、「指定されたタイムアウトが期限切れになりました。合計 4998 の要求が完了しました」と報告ab-n 5000ます。同様に、15000 回のテストを実行すると 14998 が報告されます。

これは問題ではないようです。私は正直なところかなり迷っているので、助けていただければ幸いです!:) ありがとう!

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

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 で接続を試みます

いくつかのコードをお見せしましょう: