我已经做了很多关于这个话题的搜索,但我没有太多运气。我的情况与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。我没有编写这段代码,我认为这是经过测试的生产代码。所以在这一点上我认为这是我的电脑。但是,我不想在这里走错路,也不是要求任何人为我编码。在我疯狂之前,只需要一些指导就会非常感激。
我已经排除了以下内容,即使我认为它们是一个很长的镜头:
在我的脑海中,代码是错误的,但事实上,在我认为已经过测试和部署之后我会来这个代码,这让我想到了。如果你听到蹄子,想想马匹而不是斑马。
答案 0 :(得分:0)
查看代码示例here,在“捕获数据包”标题下(如果您还没有看到它)。
有两点不同:
SocketType.Raw
)。您使用SocketType.Stream
。bind
。你的(至少在你提供的代码中)没有。根据我的经验,这两种差异都是导致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);