原始套接字-C#-设置标志

原始套接字-C#-设置标志,c#,sockets,C#,Sockets,我正在尝试编写一个应用程序,用C#发送原始套接字。我在C/C++方面没有很多经验,所以我更喜欢C#。我在C#中找到了几个原始套接字选项,但没有一个允许我设置诸如ACK、SYN、PSH、FIN等标志。关于是否可以在C#中实现这一点,有什么想法吗 任何提示都将不胜感激 更新: 我正在尝试编写一个测试防火墙的工具,我想发送状态外的数据包,带有不同标志的数据包。我使用的是Win2008,据我所知,我可以在上面做原始套接字。如果需要的话,我将使用C/C++,到目前为止,它看起来就是这样的 进一步更新: S

我正在尝试编写一个应用程序,用C#发送原始套接字。我在C/C++方面没有很多经验,所以我更喜欢C#。我在C#中找到了几个原始套接字选项,但没有一个允许我设置诸如ACK、SYN、PSH、FIN等标志。关于是否可以在C#中实现这一点,有什么想法吗

任何提示都将不胜感激

更新: 我正在尝试编写一个测试防火墙的工具,我想发送状态外的数据包,带有不同标志的数据包。我使用的是Win2008,据我所知,我可以在上面做原始套接字。如果需要的话,我将使用C/C++,到目前为止,它看起来就是这样的

进一步更新: SharpPcap看起来不错,似乎v4.0没有源代码,只有3.5有。我将试着蒙混过关,因为文档也不完整。以前有人用过吗

最终编辑: SharpPcap看起来很棒!它正在做我需要的!!我将发布一个后续问题,因为我不是.NET专家,它正在捕获,我只是无法从捕获代理部分发送数据包


谢谢大家

如果您想进入该级别,可以使用
SocketType.Raw
ProtocolType.IP
创建一个
Socket
。但是,我相信您必须手动创建表示ACK、SYN等的数据包,因此您必须阅读一些RFC文档。:)

我在网上找不到关于您的具体需求的资源,但可能值得一读这是如何实现的。至少它会让您了解如何在该级别上操作原始套接字

编辑:正如Mystere Man所指出的,这在Windows的桌面版本中是不可能的。但是,这应该适用于服务器版本。以下是官方声明:

原始套接字的限制

在Windows 7、Windows Vista、带有Service Pack 2(SP2)的Windows XP和 带有Service Pack 3(SP3)的Windows XP,能够通过 原始套接字以几种方式受到限制:

  • TCP数据不能通过原始套接字发送
  • 无法通过网络发送源地址无效的UDP数据报 原始插座。必须提供任何传出UDP数据报的IP源地址 存在于网络接口上或数据报被丢弃。这一变化 是为了限制恶意代码创建分布式应用程序的能力 拒绝服务攻击并限制发送伪造邮件的能力 数据包(具有伪造源IP地址的TCP/IP数据包)
  • 使用IPPROTO_TCP的原始套接字调用bind函数 协议是不允许的
注意具有原始套接字的绑定函数允许用于其他应用程序 协议(例如,IPPROTO_IP、IPPROTO_UDP或IPPROTO_SCTP)

上述限制不适用于Windows Server 2008 R2, Windows Server 2008、Windows Server 2003或的版本 使用SP2的Windows XP之前的操作系统


简而言之,在桌面版的windows上,您不能。从

当微软在2001年发布Windows XP时,在Winsock界面中实现了原始套接字支持,媒体批评微软断言原始套接字仅用于黑客执行TCP重置攻击。Windows XP发布三年后,微软悄悄地将Winsock的原始套接字支持限制在一个不可移动的修补程序中,并且没有为使用Winsock的应用程序提供进一步的支持或解决方法

退房

根据描述:

SharpPcap是一个用于.NET环境的跨平台数据包捕获框架,基于著名的pcap/WinPcap库。它提供了一个API,用于使用任何.NET语言(如C#和VB.NET)捕获、注入、分析和构建数据包


它在内部使用WinPcap驱动程序,因此它将允许您使用自己的IP/TCP头构建原始数据包。

即使是C套接字也不会进入ACK、SYN。。。水平。“你想做什么?”洛基:考虑一下瑞安S,因为你已经接受了他的回答。如果您稍后提出更多问题,这将鼓励其他用户回答您的问题。:)