portScan.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. //端口扫描,扫描哪些端口在使用
  2. package main
  3. import (
  4. "fmt"
  5. "net"
  6. "os"
  7. "sync"
  8. "time"
  9. )
  10. func checkPort(ip net.IP, port int, wg *sync.WaitGroup) {
  11. tcpAddr := net.TCPAddr{
  12. IP: ip,
  13. Port: port,
  14. }
  15. ch := make(chan bool)
  16. timeout := make(chan bool)
  17. go func() {
  18. time.Sleep(3 * time.Second)
  19. timeout <- true
  20. }()
  21. go func() {
  22. conn, err := net.DialTCP("tcp", nil, &tcpAddr)
  23. ch <- true
  24. if err == nil {
  25. fmt.Printf("ip: %v port: %v \n", ip, port)
  26. defer func() {
  27. if conn != nil {
  28. e := conn.Close()
  29. if e != nil {
  30. fmt.Println(e)
  31. }
  32. }
  33. }()
  34. }
  35. }()
  36. select {
  37. case <-timeout:
  38. wg.Done()
  39. case <-ch:
  40. wg.Done()
  41. }
  42. }
  43. func checkIp(ip string) bool {
  44. if net.ParseIP(ip) == nil {
  45. fmt.Println("非法ip地址")
  46. return false
  47. } else {
  48. return true
  49. }
  50. }
  51. func main() {
  52. startTime := time.Now()
  53. wg := sync.WaitGroup{}
  54. wg.Add(65534)
  55. ip := os.Args[1]
  56. if checkIp(ip) {
  57. for port := 1; port <= 65534; port++ {
  58. go checkPort(net.ParseIP(ip), port, &wg)
  59. }
  60. }
  61. wg.Wait()
  62. endTime := time.Now()
  63. fmt.Printf("执行时间 %v", endTime.Sub(startTime))
  64. }