問題タブ [setsockopt]
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++ - QTcpSocket の sockopt を設定
(リモート サーバーへの) アウトバウンド接続用の TCP ソケットを開く Linux C++/Qt5 アプリを作成しています。QTcpSocket を作成し、sockopt オプションを次のように設定しようとしました。
残念ながら、m_tcpSocket->socketDescriptor() が -1 を返すため、setsockopt は「Bad file descriptor」エラーで失敗します。アウトバウンドソケットのソケット記述子を接続前に取得するにはどうすればよいですか? または、接続後にこれを行う必要がありますか? (これは、Qtのドキュメントから理解していることと一致しているようです)
上記は、リッスン ソケット (QTcpServer) では正常に機能します....QTcpSocket ではありません。
c - 受信バッファと送信バッファのソケット バッファ サイズを設定する
C で UNIX ソケット ファイル記述子のソケット バッファ サイズを設定するにはどうすればよいですか? 私はsetsockoptがおそらく関連するシステムコールであることを理解しています...誰かがそれを使用する方法の例を与えることができます.私が見つけたものはバッファサイズを設定する方法を説明していませんか?
python - Python の QDISC_BYPASS (Raw ソケット)
raw ソケットのソケット オプションを設定して QDISC_BYPASS を有効にするにはどうすればよいですか? C での例を見ましたが、Python での実装方法を明確に理解できませんでした。AF_PACKET と SOCK_RAW の設定でソケットを構築しました。
socket.setsockopt() メソッドを使用する必要があることは理解していますが、この場合、正しく呼び出す方法がわかりません。
c - setsockopt の SO_BINDTODEVICE によるキャッシュ効果
SO_BINDTODEVICE
ソケット オプションによって、ソケットをネットワーク インターフェイスの 1 つに設定できます 。また、2 つの NIC カードを使用し、ソケットを NIC カードの 1 つに設定したい場合は、SO_BINDTODEVICE が役立ちます。
ソケットをeth1に設定すると、ソケットは eth1 インターフェイスをsetsockopt
介しSO_BINDTODEVICE
てすべてのパケットを送受信します。
これは、SO_BINDTODEVICEオプションに関するこれまでの私の理解であり、SO_BINDTODEVICEに関するステートメントがあり、それは
ソケットがバインドされているインターフェースを変更するために BINDTODEVICE を複数回呼び出すことができますが、カーネル内のキャッシュ効果のために結果が予測できない場合があります。
どういう意味ですか、わかりませんでした、接続したLANネットワークのキャッシュテーブル(ルーティングテーブル)についてです、説明お願いします
c - SO_RCVTIMEO および SO_SNDTIMEO に対する getsockopt および setsockopt の適切な使用
さまざまな理由により、サーバーのソケットへの読み取りと書き込みにタイムアウトを実装したいと考えていますが、実行に失敗しているため、問題がどこにあるのかについての洞察をお願いします。
setsocketopt()
ソケットへの読み取りと書き込みのタイムアウトを設定するために、関数とを使用しようとしていますgetsocketopt()
。ただし、戻り値は問題が発生したことを示し、perror は「無効な引数」を出力するため、何か間違ったことをしているに違いありません。setsocketopt()
不思議なことに、 andの最初の使用時に常にエラーが発生するとは限らないので、getsocketopt()
少し戸惑います。
次のサーバーとクライアントのコードは、私の問題を再現します (gcc を使用してコンパイル)
サーバーコード:
クライアントコード:
現在の例getsockopts()
では、サーバーでの 2 番目の呼び出しが失敗し、perror("3")
呼び出されます。ただし、この行をコメントアウトするとsetsockopts()
、最初の呼び出しへの最後の呼び出しがgetsockopts()
失敗します (以前は機能していたようです)。
どこが間違っているかについての洞察をいただければ幸いです
sockets - setsockopt を何度も呼び出す
ソケットを使用して 2 つのクライアント間でデータを転送するアプリケーションがあります。単一のソケットを使用して、制御およびデータ トラフィックを (UDP 経由で) 通信します。
IP ヘッダーの Qos および tos フィールドは、次を使用して変更できます。
しかし、setsockopt
(同じソケットへの) への呼び出しの数は多すぎますか? たとえば、1ms ごとに呼び出されると仮定します。
質問の範囲を狭めるために、最新の Linux システムについて質問しています (一般的な説明は大歓迎です)。
これを示す例を次に示します (これは、アプリケーションの送信専用部分です)。
ノート:
- コントロールとデータの両方が同じソケット (同じ UDP ソース ポート) を共有する必要があります。
- 複数のスレッドが同じソケットを使用します (そのため、setsockopt と sendto の間に何らかのロック メカニズムが必要ですが、これは問題の範囲外です)。
SO_PRIORITY
Linuxのみです。
c - ソケット送信バッファ サイズの最小下限を減らす方法はありますか?
UDP データグラムが小さい場合に UDP スループットがどのように影響を受けるかを確認するために、デフォルトのソケット送信バッファ サイズを小さいサイズに変更しようとしています。これを行うにはsetsockopt
、オプションを指定して関数を使用しSO_SNDBUF
、バッファ サイズを 64 バイトに設定しようとしています。getsockopt
また、関数の結果を確認するためにも使用しsetsockopt
ます。
私が使用するコードは次のとおりです。
しかし、小さな値を設定しようとするたびに、バッファ サイズの下限が 4608 バイトに設定されていることがわかります。上記のコードの出力は次のとおりです。
- デフォルトのソケット送信バッファ: 212992
- 次のように変更しようとしています: 2304
- 新しいソケット送信バッファ: 4608
さまざまなサイズを試してみたところ、これは 2304 以下のサイズで発生することがわかりました。2305 などのより大きなサイズの場合は、より大きなサイズが得られます。
- デフォルトのソケット送信バッファ: 212992
- 次のように変更しようとしています: 2305
- 新しいソケット送信バッファ: 4610
3000 など、いくつかの大きなサイズの場合は、要求したサイズの 2 倍になります。
- デフォルトのソケット送信バッファ: 212992
- に変更しようとしています: 3000
- 新しいソケット送信バッファ: 6000
ネットを検索すると、Linux はカーネル内で値を設定すると 2 倍になり、クエリを実行すると 2 倍の値が返されることが わかりました。 set/getsockopt SO_SNDBUF について
ソケット送信バッファ サイズの最小下限を減らす方法はありますか? たとえば、64 バイトに設定するには?