2

我已经对这个主题进行了很多搜索,但运气不佳。我的情况与在我的 C# sniffer 中设置套接字选项时不知道为什么会出现错误代码 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. 如果我注释掉这一个套接字选项行,代码就很好用。

在我的脑海中,代码是错误的,但是在它应该已经过测试和部署之后我才开始使用这个代码的事实让我不这么认为。如果你听到蹄声,想想马,而不是斑马。

4

3 回答 3

0

“捕获数据包”标题下查看代码示例(如果您还没有看过)。

有两点不同:

  1. 该示例使用原始套接字 ( SocketType.Raw)。你的用途SocketType.Stream
  2. bind该示例在设置选项之前调用套接字。你的(至少在你提供的代码中)没有。

根据我的经验,这两种差异很可能是您遇到 10022 错误的原因。

于 2013-09-06T20:09:54.770 回答
0

我认为socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);这只适用于原始套接字,我写了一个适合我的例子。请注意,我确实必须使用管理员权限。

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

socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
于 2016-10-29T16:28:31.373 回答
-1

this is working code:

var socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP); socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);

于 2014-08-26T11:26:41.253 回答