我已经做了很多有关该主题的搜索,但我没有很多运气。我的情况与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。我没有编写此代码,我以为这是经过测试的生产代码。因此,在这一点上,我认为这是我的计算机。但是,我不想在这里走错路,也不想让任何人为我编写代码。我疯了之前的一些指导将不胜感激。

尽管我认为以下内容比较遥远,但我已经排除了以下内容:
  • 也许HeaderIncluded不适用于ProtocolType.Tcp
    并且必须是ProtocolType.IP。经过测试,仍然可以
    错误。
  • 也许套接字类型需要为SocketType.Raw。经过测试
    这并仍然得到错误。
  • 尝试做一个
    用于HeaderIncluded的GetSocketOption并获取相同的SocketException。
  • 如果我注释掉这一个套接字选项行,则代码会很好用。

  • 在我的脑海中,代码是错误的,但是我认为应该在经过测试和部署之后才使用此代码,这一事实使我产生了其他想法。如果您听到蹄声,请思考马而不是斑马。

    最佳答案

    请查看“捕获数据包”标题下的代码示例here(如果尚未看到)。

    有两点不同:

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

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

    关于c# - 将SocketOptionName.HeaderIncluded设置为true时为什么会出现SocketException 10022?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18664668/

    10-10 21:17