我想用C#编写端口扫描器,但是由于桌面版Windows中移除了原始套接字(SocketType.Raw),因此无法使用它。我也不能使用SharpPcap或其他Winpcap的包装器,因为我使用PPPoE进行Internet连接,而Winpcap不支持PPPoE设备。
我需要使用一个实现原始套接字并且不依赖Winpcap的库。
有什么建议吗?基本上,我需要发送SYN,接收SYN/ACK或RST,但不发送ACK回复。
编辑:
对于那些不相信桌面版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数据包)的能力。
- 不允许使用原始套接字调用IPPROTO_TCP协议的bind函数。
注意 对于其他协议(例如IPPROTO_IP、IPPROTO_UDP或IPPROTO_SCTP),可以使用原始套接字调用bind函数。