問題タブ [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.
c++ - gen_tcp:send/2 を使用して送信されたデータの受信
gen_tcp:send/2 を使用してデータを送信している erlang クライアントがあります。
具体的にはこんな感じで送ってくれますが、
メッセージを受信する c++ ベースの tcp サーバーがあります。クライアントが term_to_binary/1 を使用して送信できた場合、ei_decode_X を使用してデコードできたはずです。この特定のメッセージを受信して解析する方法がわからない。つまり、メッセージ、A、B の値を知っている必要があります。
を使用してこのデータを受け取ります
そのように送信すると、データがまったく受信されていないことがわかります。しかし、term_to_binary/1 に変換して送信すると、データを受信できます。
データを送信する適切な方法ですか?
ありがとう
sockets - gen_tcp で多数の接続を並行して確立すると CLOSED エラーが発生する (バグ?)
多数の TCP 接続を並行して確立しようとすると、潜在的なバグと思われる奇妙な動作が見られgen_tcp
ます。
シナリオは、複数の同時アクセプターを持つポートでリッスンするサーバーです。クライアントから を呼び出して接続を確立しgen_tcp:connect/3
、その後サーバーに「Ping」メッセージを送信し、パッシブ モードで「Pong」応答を待ちます。「get_tcp:connect/3」呼び出しを連続して実行すると、多数の接続 (最大 28000 までテストしました) を含め、すべて正常に動作します。
この問題は、多数の接続を並行して確立しようとすると発生します (マシンによっては、75 ~ 数百の間)。ほとんどの接続は引き続き確立されますが、一部の接続はclosed
エラーで失敗しますgen_tcp:recv/3
。奇妙なことに、これらの接続は以前は失敗せず、 と の呼び出しgen_tcp:connect/3
はgen_tcp:send/2
両方とも成功していました (つまり、 が返されましたok
)。サーバー側では、これらの「奇妙な」接続に一致する接続が表示されません。つまり、返されませんgen_tcp:accept/1
。私の理解では、「get_tcp:connect/3」が成功すると、サーバー側で一致する受け入れられた接続が得られるはずです。
私はすでにバグ レポートを提出しました。そこには、より詳細な説明と、問題を示す最小限のコード例があります。Linux と Mac OS X で問題を再現し、Erlang の異なるバージョンを使用することができました。
ここでの私の質問は次のとおりです。
- 誰でも問題を再現でき、これが誤った動作であることを確認できますか?
- 回避策のアイデアはありますか? この問題に対処するには、すべての接続を順番に開始する必要があります (これには永遠に時間がかかります)。
erlang - gen_tcp を使用して Elixir のアクティブなソケットで TCP タイムアウトを検出するにはどうすればよいですか?
GenServer
経由でリモート TCP 接続に接続している がありますgen_tcp
。
opts = [:binary, active: true, packet: :line]
{:ok, socket} = :gen_tcp.connect('remote-url', 8000, opts}
私はメッセージを処理しています:
def handle_info({:tcp, socket, msg}, stage) do
IO.inspect msg
{:noreply, state}
end
これはうまくいきます。ただし、TCP サーバーはタイムアウトしがちです。を使用している場合はgen_tcp.recv
、タイムアウトを指定できます。ただし、 でactive: true
メッセージを受信するために使用しhandle_info
ており、ループして呼び出す必要はありませんrecv
。そのGenServer
ため、サーバーがタイムアウトした場合でも、次のメッセージを喜んで待ちます。
GenServer
X 秒後に TCP 接続からメッセージを受信していない場合、関数をトリガーするにはどうすればよいですか? 私は使用して立ち往生していrecv
ますか?
tcp - gen_tcp 経由で ether/ip ヘッダーを取得する方法はありますか?
着信メッセージの本文だけでなく取得する方法はありますか。だけでなくether/IP
、それのヘッダー?現在gen_tcp
、アクティブな制御プロセスによってメッセージを使用および受信しています。
今のところ、ソケットは「of_driver」を介して次のように開かれます。