前话

最近痴迷于Golang这个新兴语言,因为它是强类型编译型语言,可以直接编译成三大平台的二进制执行文件,可以直接运行无需其他依赖环境。而且Golang独特的goroutine使得多线程任务执行如new一个对象般简单。

带着为学习理解Golang的好奇心情,我试着写了个端口扫描器。

github项目链接如下, 更多的实用工具我会慢慢添加。

https://github.com/pwcong/go-tools

源码

package main

import (
"flag"
"fmt"
"net"
"os"
"regexp"
"strconv"
"strings"
"sync"
) var port int
var portRange string var parallelCounts int func init() { flag.IntVar(&port, "p", 80, "port")
flag.StringVar(&portRange, "r", "", "range ports. format is <from>~<to>. eg. 100~200")
flag.IntVar(&parallelCounts, "n", 1, "parallel counts") // 修改提示信息
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "\nUsage: %s [Options] <IP>\n\nOptions:\n\n", os.Args[0])
flag.PrintDefaults()
} flag.Parse() } func printOpeningPort(port int) { fmt.Println("port " + strconv.Itoa(port) + " is opening") } func checkPort(ip net.IP, port int, wg *sync.WaitGroup, parallelChan *chan int) { defer wg.Done() tcpAddr := net.TCPAddr{
IP: ip,
Port: port,
} conn, err := net.DialTCP("tcp", nil, &tcpAddr) if err == nil {
printOpeningPort(port)
conn.Close() } <-*parallelChan } func main() { args := flag.Args() if len(args) != 1 {
flag.Usage()
} else { ip := net.ParseIP(flag.Arg(0)) // 用于协程任务控制
wg := sync.WaitGroup{} if portRange != "" { matched, _ := regexp.Match(`^\d+~\d+$`, []byte(portRange)) if !matched { flag.Usage() } else { portSecs := strings.Split(portRange, "~") startPort, err1 := strconv.Atoi(portSecs[0])
endPort, err2 := strconv.Atoi(portSecs[1]) if err1 != nil || err2 != nil || startPort < 1 || endPort < 2 || endPort <= startPort || parallelCounts < 1 {
flag.Usage()
} else { wg.Add(endPort - startPort + 1) // 用于控制协程数
parallelChan := make(chan int, parallelCounts) for i := startPort; i <= endPort; i++ { parallelChan <- 1 go checkPort(ip, i, &wg, &parallelChan) } wg.Wait() } } } else { wg.Add(1) parallelChan := make(chan int) go func() {
parallelChan <- 1
}() go checkPort(ip, port, &wg, &parallelChan) wg.Wait() } } }

运行结果

  1. 执行 go build ./main.go, 生成二进制文件
  2. 运行二进制文件,结果如下:
    $ port-scanner.exe
    
    Usage: E:\Program Files\GoPath\bin\port-scanner.exe [Options] <IP>
    
    Options:
    
      -n int
    parallel counts (default 1)
    -p int
    port (default 80)
    -r string
    range ports. format is <from>~<to>. eg. 100~200 $ port-scanner.exe -p 80 127.0.0.1
    port 80 is opening $ port-scanner.exe -r 1~100 -n 50 127.0.0.1
    port 80 is opening

Golang 写一个端口扫描器的更多相关文章

  1. java编写一个端口扫描器

    好久没写java了,学的时候,也没学习网络编程这一块,无意中看到了一本书,于是小小复习一下java,写个端口扫描器,玩玩吧,网上这种小公具有的是,就是自己无聊写着玩玩. 源代码如下: 共两个类,比较简 ...

  2. 再议perl写多线程端口扫描器

    再议perl写多线程端口扫描器 http://blog.csdn.net/sx1989827/article/details/4642179 perl写端口多线程扫描器 http://blog.csd ...

  3. 使用golang写一个redis-cli

    使用golang写一个redis-cli 0. redis通信协议 redis的客户端(redis-cli)和服务端(redis-server)的通信是建立在tcp连接之上, 两者之间数据传输的编码解 ...

  4. mac/unix系统:C++实现一个端口扫描器

    在比较早以前,我用过S扫描器, 以及大名鼎鼎的nmap扫描器, 可以快速扫描某个主机开放的端口, 今天使用C实现这样一个软件, 编译环境为Mac, 系统版本10.11.6: #include < ...

  5. GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器

    GoWorld代码:https://github.com/xiaonanln/goworld Golang具有运行效率高.内存安全等优良特性,因此是非常适合用来进行服务器开发.使用Golang开发游戏 ...

  6. 参考MySQL Internals手册,使用Golang写一个简单解析binlog的程序

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MySQL作为最流行的开源关系型数据库,有大量的拥趸.其生态已经相当完善,各项特性在圈内都有大量研究.每次新特性发布,都会 ...

  7. golang写一个简单的爬虫

    package main import( "fmt" "io/ioutil" "net/http" ) func gethtml(url s ...

  8. Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器

    1.前提是:windows已经配置好Python的环境变量: 2.进入cmd命令行模式: **输入python命令,检测是否环境配置好:显示这样说明配置环境变量没问题 **用cd命令进入Python脚 ...

  9. 【技术分享】手把手教你使用PowerShell内置的端口扫描器

    [技术分享]手把手教你使用PowerShell内置的端口扫描器 引言 想做端口扫描,NMAP是理想的选择,但是有时候NMAP并不可用.有的时候仅仅是想看一下某个端口是否开放.在这些情况下,PowerS ...

随机推荐

  1. [控件] ChangeColorLabel

    ChangeColorLabel 效果 源码 // // ChangeColorLabel.h // YXMWeather // // Created by XianMingYou on 15/6/2 ...

  2. WDS使用捕获映像制作企业自定义映像

    来源:http://www.07net01.com/linux/WDSshiyongbuhuoyingxiangzhizuoqiyezidingyiyingxiang_545749_137448761 ...

  3. UNIX高级环境编程(1)File I/O

    引言: Unix系统中主要的文件操作包括: open read write lseek close unbuffered IO和standard I/O相对应,后面的章节我们会讨论这两者的区别. 在讨 ...

  4. Linux dumpe2fs命令详解

    dumpe2fs: 查看格式化之后的文件系统信息. dumpe2fs使用 [root@localhost omc]# dumpe2fs --help<BR>dumpe2fs 1.41.12 ...

  5. Linux ss命令详解

    ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息 ...

  6. Linux alias命令详解

    alias:内置命令(没有路径),设置命令的别名,保护系统,方便 unalias:别名取消 常用的命令展示 临时设置 alias cp='cp –i' unalias cp      取消系统的别命令 ...

  7. October 08th 2017 Week 41st Sunday

    Talent wins games, but teamwork and intelligence wins championships. 才华让你赢得比赛,团队及智慧让你赢得冠军. But the m ...

  8. symfony学习笔记1—简介

    1.symfony快速入门还是先看代码结构把,这个是拿到代码的第一印象,app/:整个应用的配置,模版,translations,这个可能是多语言文件什么,src/:项目php文件,vendor/:第 ...

  9. 【转载】socket 的 connect、listen、accept 和全连接队列、半连接队列的原理

    转自:http://blog.csdn.net/tennysonsky/article/details/45621341 写在前面: 1. accept 只是从全连接队列拿出一个已经建立好的socke ...

  10. _viewstart.cshtml的作用

    在ASP.NET MVC 3.0及更高版本中,用Razor模板引擎新建项目后,Views目录下会出现一个这样的文件:_ViewStart.cshtml. _viewstart.cshtml的作用 1. ...