go 实现简易端口扫描的示例

我在代码里定义了两个通道,分别用于生产端口和限制连接数,如果不限制连接数,容易被对方检测到或导致对方服务器不能正常运行。

// 生产端口
var port = make(chan int, 10)

// 限制并发数
var connect = make(chan string, 5)

可以使用net库的Dial函数做为socket客户端,需要注意的是要设置超时时间,因为若主机不存在,或目标端口是关闭的,往往需要花费数秒才返回错误,这样扫描大量端口时效率会极其低下。在go中可以使用net.Dialer结构体设置超时时间,然后在调用Dial方法:

d := net.Dialer{Timeout: time.Second}
dial, err := d.Dial("tcp", target)

只要err不等于nil,表示目标端口是对外开放的。
完整代码如下:

package main

import (
  "fmt"
  "net"
  "sync"
  "time"
)

var wg sync.WaitGroup

func main() {
  var start, end int
  var address string
  fmt.Printf("请输入目标IP:> ")
  fmt.Scan(&address)
  fmt.Printf("请输入起始端口:> ")
  fmt.Scan(&start)
  fmt.Printf("请输入结束端口:> ")
  fmt.Scan(&end)
  wg.Add(end - start + 1)
  Run(address, start, end)
  wg.Wait()
  fmt.Println("执行完毕")
}

// 生产端口
var port = make(chan int, 10)

// 限制并发数
var connect = make(chan string, 5)

func Run(address string,  start, end int) {

  go func() {
    for i := start; i <= end; i++ {
      port <- i
    }
  }()

  go func() {
    // 消费端口
    for p := range port {
      // 往通道写入目标地址,超过限制并发数会阻塞
      connect <- fmt.Sprintf("%s:%d", address, p)
    }
  }()

  go Connect()

}

func Connect() {
  // 并发请求
  for target := range connect {
    // 设置超时时间
    d := net.Dialer{Timeout: time.Second}
    dial, err := d.Dial("tcp", target)
    if err == nil {
      fmt.Printf("%s 连接成功\n", target)
      dial.Close()
    }else{
      fmt.Printf("%s 连接失败\n", target)
    }
    wg.Done()
  }
}

这里端口生产通道不是必须的,只是为了演示消费生产并发模型,当然这还是最简单的。
在Run函数里我没有关闭这两个通道,按官方的说法是gc会回收不使用的通道,如果要手动关闭,可以定义defer闭包进行close。
我本地运行结果如下:

请输入目标IP:> 127.0.0.1
请输入起始端口:> 8080
请输入结束端口:> 8094
127.0.0.1:8080 连接成功
127.0.0.1:8081 连接成功
127.0.0.1:8082 连接成功
127.0.0.1:8083 连接成功
127.0.0.1:8084 连接成功
127.0.0.1:8085 连接成功
127.0.0.1:8086 连接成功
127.0.0.1:8087 连接成功
127.0.0.1:8088 连接成功
127.0.0.1:8089 连接成功
127.0.0.1:8090 连接成功
127.0.0.1:8091 连接成功
127.0.0.1:8092 连接成功
127.0.0.1:8093 连接失败
127.0.0.1:8094 连接失败
执行完毕

这个版本比较简陋,TCP连接过程也可以简化,后续再写另外一篇文章。因为最近在学rust语言,语法内容比较多,所以后面暂时发布编程相关的文章,提升一下语法熟练度。

以上就是go 实现简易端口扫描的示例的详细内容,更多关于go 实现端口扫描的资料请关注我们其它相关文章!

(0)

相关推荐

  • go语言制作端口扫描器

    GO语言编写的TCP端口扫描器,本人的第一个GO程序. Git@OSC:http://git.oschina.net/youshusoft/GoScanner 使用命令: Scanner startIp [endIp] port thread 参数说明: startIp  开始IP endIp  结束IP,可选,不输入表示只扫描startIp port  扫描端口,单个端口:3389:多个端口:1433,3389:连续端口:135-3389 thread  最大并发线程数,最高2048 扫描结果

  • GO语言实现的端口扫描器分享

    复制代码 代码如下: //GO语言  实现端口扫描     //缺陷     //port  无法设置成全局变量不知道怎么设置的     //var l = list.New()   这个是数组操作并不是消息队列    跟消息队列功能类似 //实现功能     //实现生成 IP段     //实现端口扫描     //实现参数传入     //写入文件到本地     //main.go 58.215.20.30 58.215.201.30 80     //文件名 开始IP 结束IP 扫描端口

  • Go语言实现的简单网络端口扫描方法

    本文实例讲述了Go语言实现的简单网络端口扫描方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (  "net"  "fmt"  "os"  "runtime"  "time"  "strconv" ) func loop(startport, endport int, inport chan int) {   for i :=

  • go 实现简易端口扫描的示例

    我在代码里定义了两个通道,分别用于生产端口和限制连接数,如果不限制连接数,容易被对方检测到或导致对方服务器不能正常运行. // 生产端口 var port = make(chan int, 10) // 限制并发数 var connect = make(chan string, 5) 可以使用net库的Dial函数做为socket客户端,需要注意的是要设置超时时间,因为若主机不存在,或目标端口是关闭的,往往需要花费数秒才返回错误,这样扫描大量端口时效率会极其低下.在go中可以使用net.Dial

  • Python实现的端口扫描功能示例

    本文实例讲述了Python实现的端口扫描功能.分享给大家供大家参考,具体如下: 一 代码 import sys import socket import multiprocessing def ports(ports_service): #获取常用端口对应的服务名称 for port in list(range(1,100))+[143,145,113,443,445,3389, 8080]: try: ports_service[port] = socket.getservbyport(por

  • python实现的多线程端口扫描功能示例

    本文实例讲述了python实现的多线程端口扫描功能.分享给大家供大家参考,具体如下: 下面的程序给出了对给定的ip主机进行多线程扫描的Python代码 #!/usr/bin/env python #encoding: utf-8 import socket, sys, thread, time openPortNum = 0 socket.setdefaulttimeout(3) def usage(): print '''''Usage: Scan the port of one IP: py

  • 基于Python socket的端口扫描程序实例代码

    本文研究的主要是Python的端口扫描程序,具体实例代码如下. 先来看看第一个端口扫描程序代码,获取本机的IP和端口号: import socket def get_my_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr,port

  • C# 基于TCP 实现扫描指定ip端口的方式示例

    目录 一.单线程扫描 1.代码 2.界面 3.结果 4.抓包 二.多线程扫描 1.代码 2.界面 3.结果 4.抓包 三.总结 四.源码 1.github 2.gitee 一.单线程扫描 1.代码 using System; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace SingleThreadScanningPort { publ

  • Python实现的IP端口扫描工具类示例

    本文实例讲述了Python实现的IP端口扫描工具类.分享给大家供大家参考,具体如下: 去年服务器老是被攻击,每次上线之后,上线的人急急忙忙下班,忘记关闭一些端口.导致有次服务器被攻破.损失严重. 这段时间再做仪器对接,把医疗器械对接到我们SAAS平台,有些仪器是通过网线进行数据传输的.通过网线进行数据传输,无非就是通过端口号进行传输交互,但是找不到说明书,国内搞仪器对接开发的也很少,所以网上开源的或者介绍的东西很少,对于我们来说,仪器是个黑盒,想要拿到里面的东西,还要自己去摸索,去试验,比较浪费

  • python基础教程之udp端口扫描

    一.概述任务描述:开发一个程序,用于获取局域网中开启snmp服务的主机ip地址列表,并写入相应文件以便其它程序使用.背景知识:SNMP是基于UDP的,而且标准的SNMP服务使用161和162端口.思路:1.获取局域在线主机列表:2.获取各个主机的snmp端口(比如161)开启状况:3.以特定格式写入特定文件.这里只实现前两步. 二.nmap实现1.安装nmapLinux平台(CentOS为例): yum install nmap -y     widows平台(下载地址):http://nmap

  • python实现多线程端口扫描

    一个简易的TCP端口扫描器,使用python3实现. 需求:扫描目标网站开放哪些端口号,将所有开放的端口号输出. 分析:使用socket连接,如果连接成功,认为端口开放,如果连接失败,认为端口关闭(有可能端口开放但连接失败,这里简单认为端口不开放) 使用到的库:socket, threading 过程: 先定义一个函数,对给定的(ip, port)进行扫描,看其是否能连接成功. def tcpPortScan(ip, port, openPort): sock = socket.socket(s

  • C/C++ 实现简易HTTP服务器的示例

    #include <stdio.h> #include <stdlib.h> #include <process.h> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") #define BUF_SIZE 2048 #define BUF_SMALL 100 void Send_404(SOCKET sock) { char Protocol[] = "HTTP/1.

  • Python实现端口扫描器的示例代码

    目录 socket概念 socket基本用法 创建tcp套接字 实现端口扫描 socket概念 socket又称套接字,可以看做是不同主机之间的进程进⾏双向通信的端点,简单的说就是通信的两⽅的⼀种约定,⽤套接字中的相关函数来完成通信过程,发出网络请求或者应答网络请求. socket起源于Unix,⽽Unix/Linux基本哲学之⼀就是"⼀切皆⽂件",对于⽂件⽤"打开"."读写"."关闭"模式来操作.而socket就是该模式的⼀

随机推荐