2

私はこのトピックについてかなりの検索を行ってきましたが、あまり運がありません。私の状況は、「C# スニファーでソケット オプションを設定するときに、エラー コード 10022 (無効な引数) が発生する理由がわからない」とよく似ています。ただし、そこに記載されている回答は、問題の解決には役立ちませんでした。

問題を引き起こしているコードは次のとおりです。

var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true); \\ SocketException thrown here

HeaderIncluded を設定している行で、エラー番号 10022 の SocketException がスローされています。このコードは私が書いたものではなく、テスト済みの製品コードであると想定していました。したがって、この時点で、それは私のコンピューターであると考えています。ただし、ここで間違った道をたどりたくないし、誰かにこれをコーディングするように頼むつもりもありません。私が気が狂う前に、いくつかのガイダンスをいただければ幸いです。

私はそれらがロングショットだと思っていたにもかかわらず、以下を除外しました:

  1. おそらく、HeaderIncluded は ProtocolType.Tcp では使用できず、ProtocolType.IP である必要があります。これをテストしてもエラーが発生します。
  2. おそらく、ソケット タイプは SocketType.Raw である必要があります。これをテストしてもエラーが発生します。
  3. HeaderIncluded に対して GetSocketOption を実行しようとして、同じ SocketException を取得しました。
  4. この 1 つのソケット オプション行をコメント アウトすると、コードはうまく機能します。

コードが間違っていることは頭の片隅にありますが、テストと展開が完了したと思われるコードにたどり着いたという事実は、別の考えを持っています。ひづめが聞こえたら、シマウマではなく馬だと思います。

4

3 に答える 3

0

「Capturing the Packets」という見出しの下にあるコード例を確認してください(まだ見ていない場合)。

異なる 2 つの点:

  1. この例では、生のソケット ( SocketType.Raw) を使用しています。あなたの使用SocketType.Stream.
  2. この例ではbind、オプションを設定する前にソケットを呼び出します。あなたのものは(少なくともあなたが提供するコードでは)そうではありません。

私の経験に基づくと、これらの違いの両方が、発生している 10022 エラーの原因である可能性が非常に高いです。

于 2013-09-06T20:09:54.770 に答える