問題タブ [getsockopt]
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.
java - Javaでgetsockoptを呼び出してSO_ORIGINAL_DSTを取得するにはどうすればよいですか
getsockopt を呼び出して、iptables が Java アプリケーションを介して再ルーティングしたソケットの宛先 IP を取得できる既存のライブラリがあるかどうかを知っている人はいますか?
これは、Netty メーリング リストで未回答の同様の質問です。
c での呼び出しは次のようになります。
JNI でそれを行う方法の例も歓迎します。
c++ - getsockopt(...,SO_ORIGINAL_DST,...) は時々クライアントアドレスを返します
HTTP リクエストを受け入れて宛先に転送するプロジェクトに取り組んでいます。Linux (2.6.35.14-106.fc14.x86_64) と TPROXY を使用しています。以下に詳細を載せておきます。
私が見ている問題は、たまに (1000 回に 1 回、時には 100 万回に 1 回)、Linux が宛先アドレスとしてピア アドレスを返すことです。
これが起こるのを見た人はいますか?2007 年に Web で 1 つのメモを見たので、少し古いかもしれないと思います。
私は次のコードを持っています (ここに表示されている一貫性のない方法論を許してください):
ほとんどの場合、getpeername と getsockopt は正しく報告されます (以下の IPTABLE 構成を参照)。
残念なことに、get getsockopt レポートがgetpeernameと同じになることがあります。つまり、宛先がピアと同じです。
IPTABLE 構成:
アクティビティをログに記録しましたが、問題ないようです。たとえば、次の出力が得られます。
それでも、IPTables のログには、IP アドレスが正しいことが示されています。
私はこれに本当に困惑しています。
c - getockoptは、setsockoptで設定されたものとは異なるIP_TOS値を返します
値をsetsockopt
に設定するために使用しようとしています。呼び出しが返されました。ただし、は値が( )とは異なるに設定されていることを示しています。との値の不一致を引き起こした可能性があるものを誰かが知っていますか?IPTOS
IPTOS_THROUGHPUT
setsockopt
0
getsockopt
IP_TOS
1
IPTOS_THROUGHPUT
0x8
IPTOS
setsockopt
getsockopt
ログ出力は次のとおりです。
ソケット26にDSCPマーキングを設定する
ソケット26から8のsetsockoptは0を返します
ソケット26のDSCPマーキングは1であり、予想される8とは異なります。
以下はコードです:
linux - recv() 関数は内部バッファよりも多くのバイトを受け取ることができますか?
私は Linux のソケットが初めてで、そのrecv()
仕組みを理解しようとしています。説明が明確に見つからないシナリオを試しました。誰かが私を啓発してくれることを願っています。シナリオは次のとおりです。
TCP ソケットを使用して、2 つのプロセス (送信側と受信側) 間で 5 MiB のデータを送信します。Linux を実行している i.MX6 Sabrelite ボードでこれらのプロセスを実行します。
Sender.cpp:
Receiver.cpp:
受信前に関数呼び出しを使用してgetsockopt()
、内部バッファーSO_RCVBUF
サイズを取得しました。約 86 KiB でした。
recv()
5 MiB を取得するのに何回の呼び出しが必要で、各recv()
呼び出しのバイト数を確認したかったのです。
5 MiB を受信したら、出力を確認します。recv()
5 MiB のデータを取得するには、ほぼ 48回の呼び出しが必要です。最初の 40 回の呼び出しでは、86 KiB 未満しか受信しませんでした。これは、受信したバイトが内部バッファーよりも少ないため意味があります。86 KiB の 2 倍を受け取った場合、カーネルは通常、 に示されているものの 2 倍を割り当てるという説明がありましたSO_RCVBUF
。
しかし、86 KiB の 2 倍よりも多くのバイトを受信しています。
SO_RCVBUF
を使用してサイズを信頼できますgetsockopt()
か?
値を動的に変更しますか?
同じシナリオをもう一度試してみました。呼び出し回数がrecv()
異なります。しかし、受信したバイト数が割り当てられた数を超えることがあります。
c - SO_ERROR と errno
ソケット syscall (のようなrecv
) エラーを取得する場合、(パフォーマンス レベルで) どちらが優れていますか?
- 普通の古いものを使う
errno
- またはoptname
SO_ERROR
として使用しますか?getsockopt()
errno
システムコールではないため、 (私のシステムで定義さ__error()
れている)の方が高速だと思います。私は正しいですか?
SO_ERROR の利点は次のとおりです。取得後に自動的にエラーがリセットされ、エラーがソケットのみに関係していることを確認できます。より安全です。
どちらが良いと思いますか? 両者の間に本当にパフォーマンスの違いはありますか?
c - OS X getsockopt: いいえ SO_PROTOCOL
SO_PROTOCOL
OS X は、呼び出し元が「...ソケット タイプを整数として取得する」ことを可能にするソケット オプションを提供しません。( http://linux.die.net/man/7/socket )
つまり、次のプログラムは Linux でビルドして動作しますが、OS X ではコンパイルできません。
OS Xでこれを達成するにはどうすればよいですか?
c - getsockopt UDP の TCP_INFO に似た統計
私は Linux カーネル 2.6.32 (x86_64) を使用しており、 で定義されている構造体を送受信することで TCP 統計をTCP_INFO
取得できgetsockopt
ます。tcp_info
/usr/include/netinet/tcp.h
UDP についても同様の統計を取得できますか? (組み込みの輻輳制御や再送信などがないため、おそらく少ないですが、取得できる統計には満足しています)
c++ - C++ でソケットの送信バッファが空になるまでどのくらい待つ必要がありますか?
受信機が 1 つだけのネットワークを調整しようとしています。
まず、次の方法で SO_SNDBUF のサイズを検出します。
次に、次のようにして完全にいっぱいになるまで、このバッファーをいっぱいにし続けます。
もちろん、コードの関連部分だけを言及しています。
最後に、バッファがいっぱいになったら、ソケットに書き込みます。
私の問題はまだ言及されていません。上記のものはすべて、データを再送信するまで完全に機能しています。
ここで、可能な限り最大の速度で送信したいので、待機時間をできるだけ短くする必要があります。(つまり、送信バッファが空になるとすぐに再送信する必要があります)。
write()
(最も最適な方法で) 送信バッファを再度空にするために必要な時間を検出する方法は?
PS任意の時間待つように言わないでください(たとえばusleep(10000);
)