問題タブ [raw-ethernet]

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 投票する
4 に答える
5145 参照

c++ - Windows でミリ秒単位またはそれ以上の速度で何かを行う方法

この質問は、Windows (XP 以上) で何かを正確にタイミングすることに関するものではなく、callback または interrupt を介して非常に迅速に何かを行うことに関するものです。

1ミリ秒ごと、できれば100マイクロ秒ごとに何かを定期的に行う必要があります。私がする必要があるのは、この速度でいくつかの非同期ハードウェア (イーサネット) を駆動して、パケットの安定したストリームをネットワークに出力し、そのストリームが可能な限り定期的かつ同期的に見えるようにすることです。しかし、質問が(イーサネット)デバイスから分離できる場合は、一般的な答えを知っておくとよいでしょう。

「Windows を使用することさえ考えないでください!!!!」と言う前に、少し背景を説明します。すべてのリアルタイム システムに同じ要求があるわけではありません。平均して 10 ~ 16 ミリ秒ごとにオーディオまたは画像のブロックを処理する必要があるにもかかわらず、ほとんどの場合、曲とビデオは Windows で問題なく再生されます。適切なバッファリングを使用すると、Windows の遅延が変動する可能性がありますが、ハードウェアは遅延の影響をほとんど受けず、イベントの安定した同期ストリームを維持できます。それでも、私たちのほとんどは時折の不具合を許容します。私のアプリケーションはそのようなものです - おそらくかなり寛容です。

私にとって高価なオプションは、アプリケーション全体を Linux に移植することです。しかし、Linux は同じハードウェア上で動作する別のソフトウェアであるため、より優れたソフトウェアを作成し、Windows に固執することを強く好みます。競合するすべてのハードウェアとソフトウェアを排除できるという贅沢があります (インターネットやその他のネットワーク アクセスがない、他のアプリケーションが実行されていないなど)。Windows にこれを実行させる見込みはありますか? どのような制限がありますか?

ターゲット ハードウェアには高性能イベント タイマーがあり、このタイマーは割り込みをプログラムできることはわかっていますが、そのためのドライバーはありません。書いてもいいですか?そこに役立つ例はありますか?まだ見つかっていません。これは QueryPerformanceCounter に干渉しますか? イーサネット デバイスを使用するということは、select() を慎重に使用すればすべてが簡単になるということですか?

有用な記事へのポインタを歓迎します - 正確な時間を取得する方法についての概要を多数見つけましたが、忙しい待機に相当するものを使用する以外に、このようなことを行う方法についてはまだありません. 忙しい待ち時間を避ける方法はありますか?カーネル モードまたはデバイス ドライバー オプションはありますか?

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

python - Python Scapy wrpcap-pcapファイルにパケットを追加するにはどうすればよいですか?

BERやネットワーク上の遅延などをエミュレートできるソフトウェアがいくつかあります。ソフトウェアのBERモジュールをテストして、実際に正しく機能することを確認する方法が必要です。私の解決策は、typeフィールドが未使用のtypeに設定された生のイーサネットフレームを送信するプログラムを作成することです。イーサネットフレームの内部には、ランダムなビットがあります。送信されるフレームごとに、フレームをpcapファイルに記録する必要があります。ネットワークリンクの反対側には、受信したすべてのパケットを独自のpcapログに書き込むだけの受信アプリケーションがあります。テストの実行が完了すると、2つのpcapログが比較されてBERが取得されます。

私はPythonモジュールを使用してScapyおり、これまでのところ、必要なことはすべて実行しています。ランダムデータを含む生のイーサネットフレームを送信して、Wiresharkで確認できます。wrpcap()ただし、上書きする代わりに、メソッドをpcapファイルに追加する方法がわかりません。にパケットのリストを書き込むことができることはわかっていますwrpcapが、このアプリケーションは無期限に実行できる必要があり、ハードドライブに送信されたすべてのパケットの書き込みをアプリケーションが終了するまで待つ必要はありません。 。それはメモリに保存するのに多くのことになるので、何かが起こった場合、私は最初からテストを最初からやり直す必要があります。

私の質問は、ファイルを上書きする代わりに、pcapを使用してファイルに追加するにはどうすればよいですか?それも可能ですか?そうでない場合、どのモジュールが必要なことを実行できますか? scapypcap

の機能を備えたものを探しているときScapyに遭遇しましたdpktが、そのためのドキュメントはあまり見つかりませんでした。dpkt私が求めていることを実行できますか?もしそうなら、どこでそれに関するいくつかの良いドキュメントを入手できますか?

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

raw-ethernet - ローカルホストでの生のイーサネットPF_PACKETの問題

私はcで生のイーサネットプログラミングに取り組んでいます。ローカルホストで実行されている2つのファイルクライアントとサーバーがあります。socket()での通信に自分のプロトコル番号を使用しています。

クライアント側では、次のコードがあります

それから私は次のようにいくつかのデータを送信します

サーバー側では、クライアントと同じようにソケットを作成し、次のようにrecvfromを実行しています。

しかし、私はサーバー側でパケットを受信しません。誰かが私に問題が何であるかを教えてもらえますか?

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

c - イーサネット II フレーム ヘッダーを作成していますか?

Ethernet IILinux でフレームヘッダーを作成するには? 802.3 フレーム ヘッダーは、送信元と宛先の MAC と長さを指定しeth_header()て作成できます。長さの代わりにタイプフィールドを使用するフレームフォーマットにもskbuffer同じ関数を使用できますか?Ethernet II

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

linux - フレームを一時停止するためのethtool?

Linux マシンでイーサネット フレーム スニッフィング/転送プログラムを作成しています。これを使用して、コンピュータからイーサネットに、またはその逆に送信されるフレームをスニッフィングします。

ルーターへの 2 段階の送信により遅延が発生する可能性があるため、パケットを失わないように一時停止フレームをアクティブにしようとしています。

これを行う唯一の方法は、ethtool を使用して、たとえば、受信側からの一時停止フレームをオンにすることです。

私はこれについて疑問を持っていますが、ethtool の専門家が安心してくれることを願っています.

「ethtool -A」を使用して利用できるオプションは、自動ネゴシエーションをオンまたはオフにすることです。私の知る限り、自動ネゴシエーションはポーズ フレームとはほとんど関係がありません。また、一時停止フレームに関して ethtool で使用できるオプションがないことは、少し当惑させられます。たとえば、フレーム送信者によって要求された一時停止時間を管理することは、ethtool ではオプションではありません。

では、ポーズ フレームを構成するために ethtool が本当に最適な方法なのか、それとも唯一の方法なのか? 理想的には、C コードを使用して構成したいと考えていますが、ethtool がそうする唯一の方法である場合は、ethtool でポーズ フレームを構成することによって、正しいことを行っていることを確認したいと思います。

また、誰かが C でポーズ フレームを構成する方法の正しい方向を教えてくれたら、さらに感謝します。

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

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

linux-device-driver - イーサネットがbraodcastパケットを取得しない

CiscoIPTVで実行されている2.6.15カーネルに取り組んでいます。ボックスが表示されると、DHCPクライアントが電話を切ります。これは、DHCPクライアントがブロードキャストされたDHCPオファーメッセージをフェッチしないためです。

/ proc / net / devファイルを読み取ると、イーサネットデバイス(eth0)がパケットを受信して​​いないことが示されます。次に、ボックスでtcpdumpを実行しましたが、イーサネットインターフェイスでパケットが受信されていないことも示されています。

次に、(DHCPサーバーが実行されている)テストPCでwiresharkを実行しました。これは、DHCPオファーメッセージがDHCPサーバーによってブロードキャストされていることを示しています。

このDHCPクライアントとサーバーは他のボックスで正常に動作しているため、これらのプログラムで問題が発生する可能性は低くなります。イーサネットドライバに問題があるはずです。

私は本当に混乱しています。この問題にどのように進むべきですか。私を助けてください。

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

localhost - RawCap エラー:「RCVALL_SOCKETLEVELONLY を使用して無差別モード (RCVALL_ON) に入ることができません。」

PC 上のマスター/スレーブ (サーバー/クライアント) プログラム間の localhost(loopback 127.0.0.1) TCP トラフィックをキャプチャしようとしています。Wireshark はこれを行うことができませんが、RawCap が行うことは理解しています。

プログラムを実行しようとすると、RawCap と表示されます"Unable to enter promiscuous mode (RCVALL_ON), using RCVALL_SOCKETLEVELONLY."

これの原因は何ですか?

どうもありがとう!

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

linux - Linux2.4での通常のユーザーとしてのrawソケットアクセス

組み込みシステム(2.4カーネル)では、rootとして実行されていないプロセスからeth0インターフェースへのrawソケットアクセスが必要です。

コマンドラインからCAP_NET_RAW機能を設定し、プログラムでcap_set_proc()を使用してこの問題に対処しようとしましたが、どちらも成功しませんでした。私にはそうする権限がないようです。プログラムで、コマンドラインでEPERMエラーが発生します。

プロセス`1586'にキャップを設定できませんでした:(操作は許可されていません)

私がやりたいことをする簡単な方法はありますか?そうでない場合、CAP_NET_RAW機能を正常に設定するにはどのような手順が必要ですか?

編集:私はrootアクセス権を持っていますが、rootとしてプロセスを永続的に実行することはできません。libcapのバージョンは1.10で、「setcap」バイナリはありませんが、「setpcaps」があります。

編集-GeorgeSkoptsovに答える:

正しければ、setuidを使用してプロセスを開始し、CAP_NET_RAW機能を設定してから、特権を削除することをお勧めします。次のコードでこれを試しましたが、capsコマンドがエラーを返さないのに、機能しないようです。seteuid()がコメントアウトされると、rawアクセスが機能しますが、プロセスがrootとして実行されているため、次のようになります。

ご協力いただきありがとうございます。クリス

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

java - jpcapでパケットキャプチャとパケット送信を高速化するにはどうすればよいですか?

DSPは、PCがこれらのパケットをキャプチャしてack応答を送信するよりも、生のイーサネットパケットをPCに送信します。それらはMACからMACにメッセージングしているため、IP層はありません。1msごとにリアルタイムのメッセージを作りたいです。DSPは1ミリ秒ごとにメッセージを送信しますが、PCはメッセージをキャプチャして1ミリ秒未満で応答を送信することはできません。パケットのキャプチャと送信には15〜30ミリ秒かかります。この結果は私には遅すぎます。どうすればこれを速くできますか。jpcapライブラリとオペレーティングシステムWinXPx32を使用しています。

キャプチャコード:

送信コード:

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

sockets - read()を実行するときにETH_P_IPとETH_P_ALLに違いがあるのはなぜですか

私は次の設定をしています:

を使用してLinuxブリッジでRAWソケットを開くと

ソケットをeth2にバインドしています。クライアントがサーバーにパケットを送信すると、ブリッジで実行されているwiresharkは、送信元MACアドレスがclient(eth0)、宛先MACアドレスがserver(eth1)のパケットを報告します。

を実行するread()と、読み取られたデータの最初の6バイトが宛先MACアドレスであり、server(eth1)として正しく読み取られます。

ただし、ステートメントを次のように変更すると

を実行するread()と、読み取られたデータの最初の6バイトは、宛先MACアドレスがLinuxブリッジ(eth2)であることを示しています。

なぜこれでしょうか?カーネルまたはイーサネットカードドライバーは、ETH_P_IPを使用してネットワークを読み取る代わりに、独自のMACアドレスをバッファーに配置していますか?