我想用 C# 编写一个端口扫描器,但我不能使用 SocketType.Raw,因为原始套接字是从桌面版本的 Windows 中取出的。我不能使用 SharpPcap 或 Winpcap 的其他包装器,因为我使用 PPPoE 进行互联网连接,而 Winpcap 不支持 PPP 设备。
我需要使用一个实现原始套接字并且不依赖于 winpcap 的库。
有任何想法吗?基本上我需要发送 SYN,接收 SYN/ACK 或 RST 但不要发回 ACK。
编辑:
对于不相信 RAW 套接字从桌面版本的 Windows 中消失的人,请参阅此处:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms740548 (v=vs.85).aspx
在 Windows 7、Windows Vista、带有 Service Pack 2 (SP2) 的 Windows XP 和带有 Service Pack 3 (SP3) 的 Windows XP 上,通过原始套接字发送流量的能力受到以下几种方式的限制:
- TCP 数据不能通过原始套接字发送。
- 无法通过原始套接字发送具有无效源地址的 UDP 数据报。任何传出 UDP 数据报的 IP 源地址必须存在于网络接口上,否则数据报将被丢弃。进行此更改是为了限制恶意代码创建分布式拒绝服务攻击的能力,并限制发送欺骗数据包(具有伪造源 IP 地址的 TCP/IP 数据包)的能力。
- 不允许使用协议
bind
的原始套接字调用函数。注意带有原始套接字 的函数允许用于其他协议(例如、或)。IPPROTO_TCP
bind
IPPROTO_IP
IPPROTO_UDP
IPPROTO_SCTP