c#多线程ping实战

本文详细介绍了如何在C#中利用多线程技术进行Ping操作,通过实例展示了如何创建线程,设置缓冲区,处理异常,并提供了一种优化并发性能的方法,旨在帮助开发者理解并掌握在实际项目中运用多线程进行网络探测的技术要点。
摘要由CSDN通过智能技术生成
瀚海星云 -- 文章阅读 [讨论区: DotNet]
[ 上一篇][ 本讨论区][ 下一篇][ 同主题阅读]
发信人: 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值