[ 上一篇][ 本讨论区][ 下一篇][ 同主题阅读]
发信人: SharperC.bbs@bbs.sjtu.edu.cn (Wind 疾风步 Walker), 信区: DotNet 标 题: 【原创】c#多线程ping实战 发信站: 饮水思源 (Thu May 5 14:03:22 2005) 转信站: USTC!bbsnews.sdu!SJTU 终于还是弄出来了 关于发ICMP包进行ping,以检测网络各主机的连接状况 网上已有相关的C#程序 但是给出的代码是不能正常工作的,原因在于阻塞式socket的 sendto方法,当目标机不存在时,会挂起ping线程 第二,多线程下,对于收到的packet没有检查sequence,这样 就可能把ping主机a的ECHO当作ping主机b的ECHO,起不到监视 指定网络连接的作用 参考C/C++中的socket编程,作了如下改动, 1)通过SetSocketOption函数设置发送、接收超时 2)对于收到的字节流,提取其中的sequence,并与发送该包的sequence 作比较,以判断是否对应;具体在我的程序中,是添加了 public UInt16 GetSequenceNum(Byte[] buffer)函数。 测试该程序,(ping函数返回-1表示链路不通,0表示通畅) 开了8个线程ping,可以正常工作,完整代码如下: 【附C#实现ping的其他方法及优缺点】 using System; using System.Net; using System.Net.Sockets; using System.Threading; namespace pingConsole { /// <summary> /// Class1 的摘要说明。 /// </summary> class Class1 { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { // // TODO: 在此处添加代码以启动应用程序 // string[] target1 = {"127.0.0.1"}; string[] target2 = {"10.253.0.100"}; // string[] target3 = {"127.0.0.1"}; // string[] target4 = {"10.254.0.100"}; // string[] target5 = {"127.0.0.1"}; // string[] target6 = {"10.254.0.100"}; ThreadPing tp1, tp2, tp3, tp4, tp5, tp6, tp7, tp8; tp1 = new ThreadPing(target1, 400); tp2 = new ThreadPing(target2, 400); tp3 = new ThreadPing(target1, 400); tp4 = new ThreadPing(target2, 400); tp5 = new ThreadPing(target1, 400); tp6 = new ThreadP |