`
zhanghan
  • 浏览: 189304 次
  • 性别: 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)
}

 

 

 

分享到:
评论

相关推荐

    在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 问题 总结了网上一些问题...

    入门学习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; ◆ 其它...

    duck:Quack的参考实现

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

    EZwait.zip DOS(CMD)窗口和批处理命令如何实现等待(或睡眠)一定时长?小工具EZwait帮到你!目前版本:2

    (仅限Windows操作系统,需安装C++环境)平时有没有对于CMD窗口和批处理如何实现等待一定时长的问题感到困扰?我也是。我在网上也看到过类似的问题。有些利用ping,但是这样并不完美,甚至说不算一个方法。于是,我...

    glamor:通过 ICMP 回显请求 (ping) 监控主机的守护进程

    Go 中(目前)没有 ICMP 实现,因此使用系统的ping命令代替。 如果达到丢包阈值,则会通过 SMTP 发送一个简单的邮件通知。 每个主机停机状态只发送一次通知,在成功的 ICMP 回声回复给定数量后将重置。 如何安装和...

    redbench:自定义Redis命令和模块的基准测试

    Redbench是一个Go软件包,它允许使用Redis协议的自定义实现来引导服务器的基准测试。 它提供与工具相同的输入和输出。 该库的目的是为兼容服务器(例如提供基准测试,但也可以用于redis-benchmark工具未涵盖的...

    最全的oracle常用命令大全.txt

    ORACLE常用命令 一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle&gt;svrmgrl SVRMGR&gt;connect internal SVRMGR&gt;startup ...

    goircd:用 Go 编写的 IRC 服务器

    支持以下功能: 昵称加入/加入频道在频道中聊天频道中的用户列表设置通道状态用户到用户的消息对用户 PING 消息的响应频道列表* 基本登录命令* 我的每个非官方终止服务器命令谁为渠道事情这不做: 筛选频道列表基本...

    MiraiGo-CQHTTP-hakuBot:(已重构为py-hakuBot)haku-bot,小白哥哥:面向过程的,利用go-cqhttp在龙芯和其他平台快速构建的QQ机器人

    群提醒(支持命令) 欢迎新人 被at回复 已经函数实现的 api 见 hakuCore/botApi.py ,未实现的可以自行实现,具体参照 go-cqhttp 的 http 请求格式即可。 插件 about 回复关于信息 help 回复帮助信息 ping 检测...

    deadchat:端到端加密的群聊

    这项工作代表着实现上述功能的努力。 这项工作仍在进行中,除非您打算帮助进行改进,否则不建议使用。 用法 在服务器上运行server.go并使用client.py连接到它。 客户端支持以下命令: /quit Exit program /connect...

    CISCO 技术大集合

    网络侦测 ping hostname|IP address 路由跟踪 trace hostname|IP address   6. 基本设置命令 任务 命令 全局设置 config terminal 设置访问用户及密码 username username password password 设置特权密码 ...

    iirc:IRC服务器,如果我没记错的话

    iirc 不要将其放在服务器上,它还没有准备好。 以的样式实现(irc的子集)服务器。 像hector一样,受支持的命令是: USER和... PING-(您的客户端使用此命令来衡量其与服务器的连接速度。) 退出-与服务器断开连接。

    ELDK使用与开发手册

    为了这一目的,U-Boot实现了TFTP协议(参见U-Boot中的tftpboot命令)。为了使主机支持TFTP,你必须确保TFTP后台程序/usr/sbin/in.tftpd已经安装。在RedHat系统中,你可以运行下面的命令来确认: $ rpm -q tftp-...

    redeo:用于构建与redis协议兼容的TCP服务器的高性能框架

    实现了用于处理RESP(REdis序列化协议),客户端和服务器端的低级原语。 它包含供读者和编写者读取/写入请求和响应的基本包装。 包含一个极简池客户端。 有关完整的文档和示例,请参阅各个软件包和官方API文档: ...

    uboott移植实验手册及技术文档

    nand_init()函数在两个文件中实现。其调用与 CFG_NAND_LEGACY 宏有 关,如果没有定义这个宏,系统调用 drivers/nand/nand.c 中的 nand_init();否则调用自己在 本文件中的 nand_init()函数,本例使用后者。fs2410.c...

    ARM-Linux系统移植

    1.1 ADS 命令行命令介绍........................................................................................................14 1.1.1 armasm...........................................................

    LINUX系统移植及UBOOT代码分析.zip

    1.1 ADS 命令行命令介绍........................................................................................................14 1.1.1 armasm...........................................................

    嵌入式Linux系统移植步步通

    1.1 ADS 命令行命令介绍........................................................................................................14 1.1.1 armasm..............................................................

Global site tag (gtag.js) - Google Analytics