問題タブ [raw-sockets]

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

linux - rawソケットを使用するときに特定のインターフェイスを選択できますか?

特定のインターフェースを介してのみデータを送信するアプリケーションをLinuxで構築しています。生のソケットを使用して、おそらくソケットオプションの設定機能を使用してそれを行うことはできますか?

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

windows - なぜ ping は Windows で管理者権限を必要としないのですか?

重複の可能性:
管理者権限がなくても ping が機能するのはなぜですか?

TCP/IP Raw ソケットに関するMSDNの記事から:

... タイプ SOCK_RAW の一部のソケットは、多くの予期しないデータグラムを受信する可能性があることを理解することが重要です。たとえば、PING プログラムはタイプ SOCK_RAW のソケットを作成して、ICMP エコー要求を送信し、応答を受信することができます....

この一節は、ICMP ping を実行するには、Windows プラットフォームで raw ソケットを使用する必要があることを示唆しています。ただし、同じ記事には次のようにも書かれています。

注: タイプ SOCK_RAW のソケットを使用するには、管理者権限が必要です。raw ソケットを使用する Winsock アプリケーションを実行しているユーザーは、ローカル コンピューターの Administrators グループのメンバーである必要があります。そうでない場合、raw ソケット呼び出しはエラー コード WSAEACCES で失敗します。Windows Vista 以降では、ソケットの作成時に raw ソケットへのアクセスが強制されます。以前のバージョンの Windows では、他のソケット操作中に raw ソケットへのアクセスが強制されていました。

pingもちろん、他のホストの管理者になる必要はありません。それでping.exe、特別な扱いを受けますか、生のソケットを使用しますか、それとも他に何か不足していますか?

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

c - 生のethパケットを送信します。いつソケットを閉じる必要がありますか?

nfqeueueからパケットを取得し、ソケットをethカードに開いてパケットを送信することで、ブリッジを実装します(途中にロジックがあります)。

私はcppと低レベルに慣れていないので、愚かな質問をするかもしれません。

私が正しいことを理解しているなら、私はすべてのパケットのソケットを開閉するべきではありません。この例に基づいてコードを記述します-http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/

私はこのようにソケットを開きます:

私の質問は次のとおりです。1。ソケットはどのくらいの期間生きていますか? 2.ソケットがまだ開いているかどうかを確認するにはどうすればよいですか?3.どうすれば閉じられますか?シャットダウンを見ましたが、これがAPIかどうかわかりませんでしたか?4.誰かが私を本番レベルの例に導くことができますか。ソケット例外を処理することを意味します..。

ありがとうございました

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

c++ - 非同期 libpcap: パケットが失われていますか?

TCP SYN パケットのセットをホストに送信し (raw ソケットを使用)、libpcap(フィルターを使用して) 応答を取得するプログラムがあります。これを非同期 I/O フレームワークに実装しようとしていますが、応答の一部が欠落しているようです(つまり、TCP SYN と応答の間libpcapよりも時間がかからない一連の最初のパケット)。100 microsecondspcap ハンドルは次のように設定されます。

次に、フィルター (filterExpression 文字列に含まれる) を追加します。

ループでは、各パケットを送信した後、select を使用して、libpcap から読み取れるかどうかを確認します。

そしてそれを読んでください:

前に述べたように、一部のパケットが失われます (「何も受信しない」状態に陥ります)。これらのパケットがそこにあることはわかっています。なぜなら、これらのパケットを同期方式で (tcpdumpまたは実行中のスレッドを使用してpcap_loop) キャプチャできるからです。ここに詳細がありませんか?または、これは問題libpcapですか?

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

c - タイムスタンプ発信パケット

送信パケット(rawソケットを使用して送信)の正確なタイムスタンプを取得しようとしています。によるとLinux/Documentation/networking/timestamping.txt、「送信タイムスタンプの場合、送信パケットは送信タイムスタンプが添付された状態でソケットのエラーキューにループバックされます。recvmsg(flags = MSG_ERRQUEUE)で受信できます。」

残念ながら、rawソケット(で作成され、withに設定されている)で呼び出されると、recvmsg常に戻ります。私は何が間違っているのですか?発信パケットの正確なタイムスタンプを取得するためのより良い方法はありますか?-1socket(PF_INET, SOCK_RAW, IPPROTO_RAW)SO_TIMESTAMP1setsockopt

補遺(情報):

また、UDPソケット(以下のソースコード)を介して送信されたパケットからタイムスタンプを取得しようとしましたがrecvmsg-1エラーは「リソースが一時的に利用できません」(EAGAIN)です。

補遺(ソースコード):

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

linux - recvform() なしでデータを送信するためだけに SOCK_RAW ソケットを作成します

データを受信せずにデータを送信するためだけに SOCK_RAW タイプのソケットを作成した場合、カーネルがネットワーク パケットを受信し続け、そのデータグラムを (アプリケーションの) バッファーにコピーするときに問題はありますか? 言い換えれば、一部のバッファがいっぱいになった後、何が起こるのでしょうか? エラーまたは無視?

カーネルがデータグラムのコピーをアプリケーションに配信しないようにする方法がわかりません。

参照http://sock-raw.org/papers/sock_raw 0x4 raw_input

IP レイヤーは、新しい着信 IP データグラムを処理した後、ip_local_deliver_finish() カーネル関数を呼び出します。この関数は、IP ヘッダーのプロトコル フィールドを調べることによって、登録済みのトランスポート プロトコル ハンドラーを呼び出す役割を果たします (上記を思い出してください)。ただし、データグラムをハンドラーに配信する前に、アプリケーションが同じプロトコル番号で raw ソケットを作成したかどうかを毎回チェックします。そのようなアプリケーションが 1 つ以上ある場合、データグラムのコピーを作成し、それらのアプリケーションにも配信します。

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

linux - PF_PACKET を使用して生のパケットをローカル mac に送信できませんか?

を使用して構築されたイーサネットプロトコル(IPではない)で遊んでいます

ソケット(PF_PACKET, SOCK_RAW, ether_type)

小さな問題があります。送信元と送信先の mac がローカル カードの mac に設定されたパケットを作成しました。これには、bind でソケットもバインドしました。

ネットワークからパケットを正常に受信できます。Wireshark に表示される程度までパケットを送信できます。

しかし、私のリッスン アプリはそれらのパケットを認識しません。ただし、ネットワーク上の他のソースからのパケットを見ることはできます。

私の MAC アドレスは正しいバイト順で送信されているように見えることを指摘しておく必要があります。

自分宛てにパケットを送信できますか?

ネットワーク カードはループバックしませんか? Linux カーネルはループバックのために IP レベルで何か特別なことをしますか?私はそれ以下なので無視しますか?

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

c++ - プログラムがARP要求(c ++)を送信しないのはなぜですか?

私はC++で低レベルのソケットを学んでいます。ARP要求を送信する簡単なプログラムを実行しました。ソケットはパケットを送信しているようですが、Wiresharkでキャッチできません。ARPパケットを送信する別の小さなプログラムがあり、それらのパケットはWiresharkによってキャプチャされます(以下の私のプログラムはそのプログラムに触発されています)。

私は何か間違ったことをした?

削除されたコード

編集

削除されたコード

編集2
パケットにイーサネットヘッダーデータも含める必要があるようです。そこで、イーサネットヘッダーとARPヘッダーデータを含むパケットを作成します。これでパケットは消え、Wiresharkによってキャプチャされます。しかし、Wiresharkはそれが無償であると言います。ご覧のとおり、送信者と受信者のIPアドレスまたはMACアドレスも正しく設定されていないようです。


編集3

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

c - Windows、Linux、MacのTCPシーケンス番号を取得するためのCコード

プロセスで使用されるTCPシーケンス番号を取得する方法(rawソケットなどを使用)はありますか?たとえば、プロセスがアクティブでTCP接続がアクティブな場合、プロセスが開始された時点からそのプロセスのTCPシーケンス番号を取得することは可能ですか、または少なくともプロセスが送受信した最後の確認応答番号を取得することはできますか?もしそうなら、Cまたは低水準言語を使用してそれをどのように行うのですか?

事実上、次のことができます。

  • ProcessAは、アクティブなProcessBに関連付けられた(ProcessAが開始するまでに)すでに送信されているTCPシーケンス番号を検出しますか?

または

  • ProcessAは、事後にProcessAによって受信または送信された最後のACK番号を検出できますか?
0 投票する
1 に答える
24987 参照

c++ - Linux 上の C/C++ によるシンプルな raw ソケット サーバー

raw ソケットを使用してイーサネット ネットワークを構築しようとしています。TCP/IP、UDP、またはその他のプロトコルを使用できません。

これは、すべての異なるプロトコル層を処理するためのリソースを持たない非常に単純なハードウェアと通信するためです。私のネットワークは、イーサネット スイッチを介して複数のハードウェアと通信する 1 台のホスト コンピュータで構成されます。この時点で、基本的には単純なパケットを各ハードウェアに送信し、拡張できる単純なサーバーを確立したいだけです。私のシステムは Linux を実行しており、サーバーは C または C++ で作成する必要があります。

raw ソケットの使用方法に関する情報を見つけようとしていますが、誰もが常にそれらを使用しないと言い、情報を提供しません。私はかなり強力なプログラミングのバックグラウンドを持っていますが、ネットワーキングの経験はありません。開始方法や関連するチュートリアルがどこにあるかについて、誰かが情報を提供できますか?