将SocketOptionName.HeaderIncluded设置为true时,为什么会出现SocketException 10022?

时间:2013-09-06 18:55:37

标签: c# sockets socketexception

我已经做了很多关于这个话题的搜索,但我没有太多运气。我的情况与Don't know why I'm getting Error Code 10022 (Invalid Argument) when setting socket options in my C# sniffer非常相似。但是,那里给出的答案并没有帮助我解决问题。

给我带来麻烦的代码是:

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. 如果我注释掉这一个套接字选项行,代码效果很好。
  5. 在我的脑海中,代码是错误的,但事实上,在我认为已经过测试和部署之后我会来这个代码,这让我想到了。如果你听到蹄子,想想马匹而不是斑马。

3 个答案:

答案 0 :(得分:0)

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

有两点不同:

  1. 该示例使用原始套接字(SocketType.Raw)。您使用SocketType.Stream
  2. 示例在设置选项之前调用套接字上的bind。你的(至少在你提供的代码中)没有。
  3. 根据我的经验,这两种差异都是导致10022错误的极可能原因。

答案 1 :(得分: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);

答案 2 :(得分:-1)

这是工作代码:

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