当我们从udp端口发送数据包时,如果网络返回ICMP主机不可达,则会收到异常。该异常并没有告诉我们任何有用的东西(比如ICMP数据包的内容)。
没问题,我们只会听取ICMP,这将为我们提供所需的信息,同时忽略UDP端口上的异常。因此,打开一个原始套接字,侦听ICMP数据包并从那里开始。
在开发中运行良好(Win XP)但在服务器2008上的生产中,运行exe的安全上下文必须具有管理员权限才能打开原始套接字。这对于服务来说是无用的。如果我理解微软所说的话,那么我们可以做我们想要的唯一方法就是在具有管理员权限的帐户下运行我们的服务。对于一个花生感觉有点像大锤,更不用说潜在的安全漏洞,让网络面临服务在管理员帐户下运行。
我真的希望我在这里错了,但我似乎找不到任何与上述相矛盾的东西。
任何人都有任何意见/暗示或同情?
答案 0 :(得分:1)
为什么不发送品牌打击新的ICMP回应请求,而不是监听ICMP对失败的UDP发送的响应?
当您收到异常时,您可以通过PInvoke IcmpSendEcho()
函数(来自Win32 IP Helper API)自行生成新的ICMP echo请求。关键位是该函数返回一个缓冲区,其中包含回复回复,包括状态代码,例如IP_DEST_HOST_UNREACHABLE
。
我认为您不需要任何特殊权限来执行此操作,因此它应该比使用原始套接字侦听ICMP回复更容易。
您需要三个功能:IcmpCreateFile()
,IcmpSendEcho()
和IcmpCloseHandle()
- PInvoke.net具有必要的互操作详情:
http://www.pinvoke.net/default.aspx/icmp/IcmpCreateFile.html http://www.pinvoke.net/default.aspx/icmp/IcmpSendEcho.html http://www.pinvoke.net/default.aspx/icmp/IcmpCloseHandle.html
答案 1 :(得分:0)
我自己有Listen for ICMP packets in C#完全相同的问题。实际上看起来你的问题是Windows权限,所以帖子无济于事。
我计划深入研究的一个方面是检查UdpListener生成的SocketException中是否还有其他信息。这似乎是不合理的,因为Windows使用ICMP数据包来生成异常,它不会在某个地方记录该数据包中的信息。
与您一样,我无法从.Net级别的异常信息中获取ICMP信息,但我想看看是否还有其他可以通过Win32 API获取的内容,例如GetLastError或其他一些专门针对WinSock32的调用。
答案 2 :(得分:0)
来自MSDN website:
使用SOCK_RAW类型的套接字 需要管理权限。 运行Winsock应用程序的用户 使用原始套接字必须是成员 的管理员组 本地计算机,否则原始套接字 调用将失败,错误代码为 WSAEACCES。在Windows Vista及更高版本中, 对原始套接字的访问是强制执行的 套接字创建。在早期版本中 对于Windows,访问原始套接字是 在其他套接字期间强制执行 操作
为了解决我的项目中的这个问题,我创建了一个Windows服务,作为我们的UI应用程序的网络代理。 Windows服务在本地管理员帐户下运行,以克服限制。应用程序使用WCF连接到服务,告诉它要打开哪种类型的套接字以及要应用哪些过滤器。然后使用Protocol Buffers通过回调将数据发送回来进行编码(至少是计划 - 回调部分仍在进行中)。