`
zhanghan
  • 浏览: 192597 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论

Go 实现 Ping命令,

阅读更多

怎么说呢

这也不是一个完整的Ping过程处理,

更像是一个可以测试Ping服务器的工具。

支持并发,编译完后,可以用ping.exe -help 查看使用说明

上代码吧,

 

/**
 * 邪恶的Ping命令,
 * 只发数据报,不接收,而且可以伪造别人的IP
 */
package main

import (
	"bytes"
	"flag"
	"fmt"
	"net"
	"time"
        "runtime"
)

var (
	datalen    int    = 100
	timeout    int    = 10
	targethost string = "www.XXXXX.com"
	localIp    string = "102.23.24.5.135"
	times      int    = 10
	concurrent int    = 10 //10个并发
)

func doPing(laddr *net.IPAddr, raddr *net.IPAddr, b *[]byte) {
	defer func() {
		tmp <- true
	}()
	conn, err := net.DialIP("ip4:icmp", laddr, raddr)
	if err != nil {
		fmt.Println(err.Error())
		return
	}
	conn.SetDeadline(time.Now().Add(time.Duration(timeout) * time.Second))
	_, err = conn.Write(*b)
	if err != nil {
		fmt.Println(err.Error())
	}
	defer conn.Close()
}

var tmp chan bool

func main() {

	flag.StringVar(&targethost, "target", "www.baidu.com", "目标地址")
	flag.StringVar(&localIp, "local", "102.23.24.5.135", "发送源地址")
	flag.IntVar(&timeout, "timeout", 10, "超时设置,单位秒")
	flag.IntVar(&datalen, "datalen", 1024, "携带数据包大小")
	flag.IntVar(&times, "times", 1, "Ping次数")
	flag.IntVar(&concurrent, "concurrent", 1, "并发数,不能小于Ping次数")
	flag.Parse()
	fmt.Printf("Ping %s\n发送方IP:%s\n,数据长度:%d\n超时:%d秒\n发送次数:%d\n并发数:%d\n", targethost, localIp, datalen, timeout, times, concurrent)
	tmp = make(chan bool, concurrent)
        runtime.GOMAXPROCS(runtime.NumCPU())
	var (
		laddr    = net.IPAddr{IP: net.ParseIP(localIp)}
		raddr, _ = net.ResolveIPAddr("ip", targethost)
	)
	//直接构造ICMP包,带数据的
	b := []byte{8, 0, 0, 0}
	b = append(b, bytes.Repeat([]byte("a"), datalen)...)
	csumcv := len(b) - 1 // checksum coverage
	s := uint32(0)
	for i := 0; i < csumcv; i += 2 {
		s += uint32(b[i+1])<<8 | uint32(b[i])
	}
	if csumcv&1 == 0 {
		s += uint32(b[csumcv])
	}
	s = s>>16 + s&0xffff
	s = s + s>>16
	b[2] ^= byte(^s & 0xff)
	b[3] ^= byte(^s >> 8)

	start := time.Now()
	//使用并发
	for i := 0; i < concurrent; i++ {
		go doPing(&laddr, raddr, &b)
	}
	for i := 0; i < times; i++ {
		<-tmp
		if i < times-concurrent {
			go doPing(&laddr, raddr, &b)
		}
		fmt.Print(".")
	}
	sub := time.Now().Sub(start) / 1e6
	fmt.Println()
	fmt.Printf("全部请求发送完成,耗时:%d毫秒", sub)
}

 

 

 

分享到:
评论

相关推荐

    开源项目-digineo-go-ping.zip

    开源项目-digineo-go-ping.zip 是一个在/r/golang社区展示的简单ping库,由Go语言编写。这个库提供了方便的API,允许开发者在Go应用程序中轻松地实现网络探测功能,即发送ICMP回显请求(通常称为ping)到其他主机,...

    golang并发ping主机的方法

    `ping`函数接收一个IP地址,调用`RunCMD`函数执行ping命令。在`main`函数中,首先设置`GOMAXPROCS`为当前CPU的核心数,这样可以充分利用多核处理器的性能。然后,打开文件`pinglist.txt`,逐行读取IP地址并存入切片`...

    pinggo:ping go版本

    【标题】"pinggo:ping Go版本"是一个基于Go语言实现的网络诊断工具,它提供了类似于标准`ping`命令的功能,用于检查网络连通性。这个项目有两个版本,可能分别代表了不同阶段的开发或者实现了不同的功能特性。通过...

    ICMP.Ping.zip_Go_ Go_ Go!_icmp attack

    ICMP协议是TCP/IP协议族的一部分,主要用于网络诊断和错误报告,例如,它用于ping命令,用来检查网络连接的可达性。在安全领域,ICMP协议由于其简单性和无状态性,常常被滥用为攻击工具。 标签中的“go _go _go!”...

    在Docker构建的容器中实现安装ping工具

    下面是Ubuntu下安装Ping工具的命令: sudo apt-get update && apt-get install iputils-ping 补充知识:standard_init_linux.go:211: exec user process caused “no such file or direct 问题 总结了网上一些问题...

    cisco 命令用法及说明

    Cisco命令是网络管理员在配置和管理Cisco路由器、交换机及其他网络设备时所使用的命令行界面(CLI)命令。这些命令覆盖了网络设备的各种操作,包括配置、监控、故障排查和优化。以下是一些主要的Cisco命令及其用途: ...

    Go-一个使用Golang和PostgreSQL的GraphQL完整例子

    在本文中,我们将深入探讨如何使用Golang(Go语言)和PostgreSQL数据库来构建一个完整的GraphQL服务。GraphQL是一种强大的查询语言,用于API,它允许客户端定义所需数据的结构,从而提供更灵活的数据获取方式。而Go...

    Go-简单实用golang框架

    Go语言,也称为Golang,是由Google开发的一种静态类型的、编译式的、垃圾回收的、并发型且具有C/C++风格语法的编程语言。它在近年来因其高效的性能、简洁的语法以及内置的并发支持而备受开发者青睐。"Go-简单实用...

    uboot常用命令.docx

    Uboot 命令详解 Uboot 是一个开源的 Bootloader,广泛应用于嵌入式系统中。下面是 Uboot 中常用的...这些命令都是 Uboot 中常用的命令,了解这些命令可以帮助开发者更好地使用 Uboot,实现嵌入式系统的开发和调试。

    golang路由,集成mysql,redis。读取配置文件信息

    这里我们创建了一个新的Redis客户端,并通过`Ping()`命令检查连接是否正常。 接下来,我们聊聊Goroutines和Channels,它们是Golang并发编程的核心。Goroutine是一种轻量级的线程,可以并发地执行任务。而Channel则...

    ipscanner_v0.0.1.zip

    ping命令是网络管理员最常用的工具之一,用于检查网络连接和设备的可达性。在Go语言中,我们可以使用`net`包中的`ICMP`功能来实现带ICMP的ping操作。这个服务在第一次连接时,会返回所有在线设备的列表,这通常是...

    go 语言框架 gin 的中文文档.zip

    Go语言,又称为Golang,是Google推出的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。它以其简洁的语法、高效的性能以及内置的并发支持,受到了广大开发者的喜爱。在Web开发领域,Gin框架作为Go语言的...

    入门学习Linux常用必会60个命令实例详解doc/txt

    ◆ 网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、 nslookup; ◆ 系统安全相关命令:passwd、su、umask、chgrp、chmod、chown、chattr、sudo ps、who; ◆ 其它...

    linux常用命令解析

    `ping` 命令用于测试与另一台计算机的网络连通性。 - **基本用法**: - `ping [ip_address]`:向指定 IP 地址发送 ICMP 请求包。 - `ping -c [count] [ip_address]`:发送指定次数的 ICMP 请求包。 - `ping -i ...

    duck:Quack的参考实现

    视窗使用duck.exe 在管理员命令提示符下运行duck屏幕截图目标更好地替代终端ping命令在后台捕获高延迟事件,并在审核时使其清晰可见特征终端内ASCII延迟图表终端中延迟的着色(仅适用于Mac和Linux) 每30秒打印一次...

    基于go语言gin框架封装的web项目骨架

    在本文中,我们将深入探讨如何使用Go语言的Gin框架构建一个Web项目骨架。Gin是一个用Go编写的轻量级、高效率的HTTP web框架,它提供了丰富的中间件支持和简洁的API设计,使得开发Web应用变得快速而高效。 **一、Gin...

    golang 检查网络状态是否正常的方法

    通过上述示例代码,我们可以看到如何利用Go语言的强大功能来轻松实现网络状态检查。这不仅有助于开发者快速定位网络问题,同时也为构建更稳定可靠的网络应用提供了基础。希望本文能够帮助到正在学习或使用Golang的...

    U-Boot常用命令

    除了上述命令外,U-Boot还允许用户设置和修改环境变量,以实现更加灵活的定制化配置。以下是一些常用的环境变量及其用途: - **`ipaddr`**: 设置U-Boot的IP地址。 - **`serverip`**: 设置TFTP服务器的IP地址。 - **...

    u-boot移植手册

    此外,文档还简要介绍了ARP协议和TFTP协议,这两个协议分别在ping命令和TFTP命令的实现中起到了关键作用。 文档的附录部分还包含了U-Boot的lds文件详解、ARMGCC内嵌汇编手册、typedef用法小结、U-Boot中typedef应用...

Global site tag (gtag.js) - Google Analytics