問題タブ [datagram]

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 に答える
4429 参照

java - udp パケットのフォーマットを設定するには?

課題では、2 台のラップトップの無線 LAN カードをアドホック モードに切り替えてから、適切な SSID を選択することにより、2 台のラップトップ間でアドホック ネットワークを形成する必要がありました。ラボトップ間にアドホック ネットワークを作成しました。次に、ソケットを使用して一方のラップトップから単純な「Hello World」メッセージを送信し、もう一方のラップトップでそれを受信するための「送信側」アプリケーションと「受信側」アプリケーションを開発する必要がありました。私は udp データグラム ソケットと udp パケット (アドホック ネットワークにはサーバーがないため. 唯一の問題は、データが最大長 = 64 KB のバイトの配列として表される場合、パケット形式が次のようになる必要があると述べられていることです (IP アドレスが提示されていると仮定します)。 2 バイト):

受信者側では、送信されたパケットのアドレスを packet.getAddress(); を使用して取得できることを知っています。受信者側のアドレスは既にわかっていますが、この形式の目的やパケットの形式を設定する方法がわかりません。UDP パケットの実際の形式と、Java で UDP パケットの形式を設定する方法を知りたいだけです。バッファ バイト配列、intelAddress、およびポートを指定して dataGram パケットを作成すると、パケットのフォーマットがどのように設定されますか? 上記と同じ形式になるようにバッファバイト配列を変更する必要がありますか(ただし、送信者のアドレスは送信されます)?できるだけ早く返信してください。どんな助けでも大歓迎です。前もって感謝します。

0 投票する
2 に答える
692 参照

trim - 受信した DatagramPacket の 0x00 をトリミングする

私の Java アプリでは、DatagramSocket を介して DatagramPacket を受け取ります。パケットに含めることができる最大バイト数はわかっていますが、実際にはすべてのパケット長が異なります (最大長を超えない)。

MAX_PACKET_LENGTH = 1024 (バ​​イト) と仮定しましょう。そのため、DatagramPacket を受信するたびに 1024 バイトの長さになりますが、すべてのバイトに情報が含まれているとは限りません。パケットに 10 バイトの有用なデータがあり、残りの 1014 バイトが 0x00 で埋められる場合があります。

有用なデータのみを他のレイヤーに渡すために、この 0x00 (未使用) バイトをトリミングするエレガントな方法があるかどうか疑問に思っています。(おそらくいくつかのJavaネイティブメソッド?ループに入り、パケットに含まれるものを分析することは、望ましい解決策ではありません:))

すべてのヒントをありがとう。ピーター

0 投票する
2 に答える
1427 参照

java - ソケットを使用してC++アプリケーションからJavaアプリケーションにファイルを転送する

ソケットを使用してC++アプリケーションからJavaアプリケーションにファイルを転送しようとしています。ファイルを送信するために、この単純なコードをC++で記述しました。

Java側では、これが受信したデータを書き留める方法です。

その結果、私が受け取ったファイルはある時点で正しいのですが、完全ではありません。JavaまたはC++の部分でコードが枯れてしまったことに何か問題がありますか?ありがとう!

0 投票する
4 に答える
4069 参照

java - 「失われた」UDPパケット(JBoss + DatagramSocket)

私はJBoss+EJBベースのエンタープライズアプリケーションの一部を開発しています。私のモジュールは、大量の着信UDPパケットを処理する必要があります。負荷テストを行ったところ、11ミリ秒間隔でパケットを送信した場合はすべて問題ないようですが、10ミリ秒間隔の場合は一部のパケットが失われます。私の意見ではかなり奇妙ですが、10 / 11msの間隔の負荷テストの比較を数回行ったところ、常に同じ結果になりました(10ms-いくつかの「失われた」パケット、11ms-すべてが正常です)。

同期に問題がある場合は、11msのテスト(少なくとも1つのパケットが失われたか、少なくとも1つの間違ったカウンター値)の場合にも表示されると思います。したがって、同期が原因でない場合は、パケットを受信するDatagramSocketが期待どおりに機能しない可能性があります。

受信バッファサイズ(SO_RCVBUF)のデフォルト値は57344であることがわかりました(おそらく、基になるIOネットワークバッファに依存します)。このバッファがいっぱいになると、新しい着信UDPデータグラムが拒否される可能性があります。この値をもう少し高く設定しようとしましたが、誇張すると、バッファがデフォルトのサイズに戻ることに気付きました。基盤となるレイヤーに依存している場合、JBossレベルから特定のOS /ネットワークカードの最大バッファーサイズを確認するにはどうすればよいですか?

受信バッファサイズが原因である可能性はありますか、または57344値がほとんどの場合を処理するのに十分な大きさである可能性がありますか?そのような問題の経験はありますか?

DatagramSocketにタイムアウトが設定されていません。私のUDPデータグラムには約70バイトのデータが含まれています(データグラムヘッダーを含まない値)。

[編集 済み]CiscoNetflowデータを受信するため、UDPを使用する必要があります。UDPは、ネットワークデバイスがトラフィック統計を送信するために使用するプロトコルです。また、送信バイト形式には影響しません(たとえば、パケットのカウンターを追加できないなど)。すべてのパケットが処理されるとは限りませんが(一部のデータグラムが失われる可能性があります)、ほとんどのパケットを処理することを期待しています。10ms間隔のテスト中に、パケットの約30%が失われました。

処理が遅いとこの問題が発生する可能性はほとんどありません。現在、シングルトンコンポーネントは、ループ内でreceiveメソッドを呼び出すDatagramSocketへの参照を保持しています。パケットが受信されると、キューに渡され、プールのステートレスコンポーネントから選択されて処理されます。「ファサード」シングルトンは、パケットを受信して​​処理に渡すことのみを担当します(完了イベントの処理を待機しません)。

よろしくお願いします、Piotr

0 投票する
3 に答える
15734 参照

java - JavaでUDPを介してintを送信する方法

UDPを介して単一のintを送信するコードを少し書き込もうとしています。私がこれまでに持っているコード:

送信者:

受信者:

問題は、受信機が画面に「50」を印刷していることですが、これは明らかに正しくありません。問題は、どういうわけか文字列などで送信していて、正しく読み取れないことだと思います。何か助けはありますか?

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

java - 限られた時間 (タイムアウト) に DatagramSocket のみのブロックから読み取るにはどうすればよいですか?

ネットワーク パケット伝送損失のシミュレーションを実行しています。サーバー アプリからクライアントにデータが返されないことがあります。

私のクライアントでは、毎秒 10 回、サーバーに対して ping を実行しています。ただし、サーバーが何も返信しない場合、クライアントは次のパケットが受信されるまで待機します。サーバーから何も得られない場合、どうすれば次の繰り返しに進むことができますか?

0 投票する
3 に答える
2773 参照

c - データグラム ソケットへの書き込みで SIGPIPE が発生することはありますか?

が原因で呼び出し元を強制終了しないようにする必要があるコードを使用していますSIGPIPEが、実行している唯一のソケット書き込みはデータグラム ソケット (UDP と Unix ドメイン データグラム ソケットの両方) への書き込みです。心配する必要はありSIGPIPEますか?私はconnectソケットで使用していますが、(Linux での) 予備テストECONNREFUSEDでは、Unix ドメイン ソケットでリッスンしている人がいない場合、送信を開始するだけであることが示されました。UDP で何が起こるかわかりません。

すべてをハックでラップして を取り除くことができますSIGPIPEが、それが問題でない場合は、オーバーヘッドを節約し、コードの複雑さを抑えたいと思います。

0 投票する
4 に答える
443 参照

java - DatagramPacket 送信スレッドの実行速度が速すぎる

基本的に DatagramPackets のリストを格納する Java スレッド (Runnable) を作成しました。リストのサイズが 0 より大きい場合、リストの最初の項目が送信されます。

runメソッド内に大きなスリープを入れないと、スレッドが応答しなくなるようです

_packetQ は、データグラム パケットのリンク リストです。

とにかく、スレッドのロックを停止するか、packetQ.size() > 0 の場合にのみ実行することができます

ありがとう

更新: コードのエラーが原因で、パケットがキューにプッシュされていませんでした。それをデバッグするのに 1 時間を無駄にしました。回答ありがとうございます**

0 投票する
3 に答える
854 参照

linux - Linux カーネル -> ユーザー空間のマルチキャスト ストリーミング データグラム

いくつかのメモリ マップ ハードウェア用の Linux ドライバーを作成する予定です (FPGA 内にあるため、必要に応じて両端でこのメモリ マップ インターフェイスを調整できます)。

この FPGA ロジックは、一連のデータグラムを生成します。これを処理してから、イーサネット リンクを介して送信する必要があります。処理またはネットワーク コードのいずれかがカーネルにある理由はないので、データのブロックをハードウェアからユーザー空間に移動するための「最良の」メカニズムについて質問しています。最大の複雑さは、ユーザー空間の処理を複数のプロセスに分散する必要があることです。

データレートはそれほど高くなく (最大 1Mbps)、mmio インターフェイスはかなり深い FIFO (現在は 2KB、最大 8KB まで増やすことができます) によって供給されるため、優先度の高いユーザーモードプロセスが追いつくことができると思います。

私が本当に欲しいのは、既存のマルチキャスト ユーザー空間インターフェイスを備えた既存のドライバーへのポインターです (それ以外はそれほど複雑ではありません)。しかし、何をしなければならないかの概要は、合理的な代用になるでしょう。

これまでに次のアイデアを収集しました。

  • AF_NETLINK: マルチキャストをサポートし、バッファリングを処理します。しかし、API は不安定で、他のインツリー ドライバーと競合する可能性のある新しいソケット ID を定義する必要があり、ユーザー モード インターフェイスは非常に特殊化socatされており、データ ストリームのテストなどの標準ツールを使用することはできません。

  • ユーザー空間からデータグラムモードのソケットまたは FIFO ファイル記述子を渡し、それに書き込みます (どのように?)。私が適用できる unix ドメイン データグラム ソケット マルチキャスト パッチがあります。

  • キャラクター モード デバイスを単一の優先度の高いユーザー モード アプリケーションに公開します。このアプリケーションは、UNIX ドメイン データグラム ソケット サーバーとして機能し、接続されている各ノードにデータグラムをコピーします。キャラクタ モード デバイスのデータグラム境界は維持されますか (つまり、ドライバ関数がバッファ サイズreadよりも少ないバイト数を返す場合、そのデータ ブロックを 1 つのユニットとして返すか、ブロックをフラグメント化して再構築できますか?の代わりに?ドライバーの読み取り関数がデータグラムが切り捨てられたことを示すために使用できるようなものはありますか、それともソケットでのみ使用できますか?)freadfreadread (2)fread (3)EMSGSIZE

  • 複数のユーザー モード アプリケーションで同時に開くことができるキャラクター モード デバイスを公開し、データを各カーネル内にバッファーします。

私は、着信パケットを再ルーティングする UNIX ドメインサーバーを備えたキャラクターモードデバイスに傾いています。これにより、カーネル ドライバー内にバッファリング ロジックを実装する必要がなくなりました。select問題は、割り込みが発生したときに呼び出しまたはブロック読み取りからユーザープロセスをウェイクアップする方法です。私のpoll関数は、制御レジスタを読み取って、POLLIN|POLLRDNORMデータが既に利用可能な場合は戻り、そうでない場合は割り込みのマスクを解除できるようです。そして、割り込みハンドラーは、準備完了 wake_upのフラグを立てるために使用します。常に割り込みをマスクします。wait_queueread

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

java - tcp から udp への Java ソケット

Javaでこのコード(tcp)をudpに取得するにはどうすればよいですか? ありがとう。