невозможно переключение типов: ErrorType (тип refle.Type) не может иметь динамический тип * os.SyscallError (отсутствует метод Align) - PullRequest
0 голосов
/ 22 сентября 2018

Попытка определить, что является ошибкой подключения, и вернуть значение обратно программе.

d := net.Dialer{Timeout: 20*time.Second}
conn, errors := d.Dial("tcp", fmt.Sprintf("%v:%v", host, port))
if errors != nil {
    if oerr, ok := errors.(*net.OpError); ok {
        ErrorType := reflect.TypeOf(oerr.Err)
        switch ErrorType.(type) {
            case *os.SyscallError:
                fmt.Println("connect: connection timed out to", host, "on port", port )
            case *poll.TimeoutError:
                fmt.Println("connect: connection refused to", host, "on port", port )
            default:
                panic("Unknown connection errot")
        }
    }
} else {
    fmt.Println("connect: connection successful to", host, "on port", port )
}

if conn != nil {
    conn.Close()
}

Получить следующую ошибку # arguments-line-arguments ./main.go:33:9:невозможно переключение типов: ErrorType (тип refle.Type) не может иметь динамический тип * os.SyscallError (отсутствует метод Align) ./main.go:35:15: undefined: poll

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Этот код не элегантный, но работает сейчас.

package main

import (
    "flag"
    "fmt"
    "net"
    "os"
    "time"
)

// Run the port scanner
func main() {
    var host, port string
    flag.StringVar(&host, "H", "", "host to scan")
    flag.StringVar(&port, "p", "", "port to scan")
    flag.Parse()

    if host == "" || port == "" {
        fmt.Println("Usage: portscan -H <host> -p port")
        os.Exit(1)
    }

    d := net.Dialer{Timeout: 20*time.Second}
    conn, errors := d.Dial("tcp", fmt.Sprintf("%v:%v", host, port))
    if errors != nil {
        if oerr, ok := errors.(*net.OpError); ok {
            switch oerr.Err.(type) {
            case *os.SyscallError:
                fmt.Println("connect: connection refused to", host, "on port", port )
            default:
                if oerr.Timeout() {
                    fmt.Println("connect: connection timed out to", host, "on port", port )
                } else {
                    panic("Unknown connection error")
                }
            }
        }
    } else {
        fmt.Println("connect: connection successful to", host, "on port", port )
    }

    if conn != nil {
        conn.Close()
    }
}
0 голосов
/ 22 сентября 2018

Вам не нужно использовать отражение здесь.Вам нужно просто ввести конструкцию языка утверждений:

    conn, errors := d.Dial("tcp", fmt.Sprintf("%v:%v", host, port))
    if oerr, ok := errors.(*net.OpError); ok {
        switch oerr.Err.(type) {
        case os.SyscallError:
         ...
        }
    }

Имейте в виду, вы не можете использовать poll.TimeoutError, потому что пакет poll является внутренним, и вы не можете его импортировать.Независимо от всего вышесказанного, если вы хотите проверить, связана ли ошибка с тайм-аутом, вы должны использовать метод Timeout, который определен в net.OpError

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...