Go 如何使用conn.read()读取横幅

Go 如何使用conn.read()读取横幅,go,Go,我正在使用Go连接到随机端口。让我们假设它是22,因为这是一个很好的例子。有些港口有横幅,有些没有 我正在尝试获取连接到端口后立即显示的横幅。在本例中,SSH-2.0-OpenSSH_7.9但是下面的代码并没有给我任何信息,也没有错误 我在想我哪里出了问题 banner := make([]byte, 0, 256) connStr := net.JoinHostPort(host, port); dialer := net.Dialer{Timeout: 3 * t

我正在使用Go连接到随机端口。让我们假设它是22,因为这是一个很好的例子。有些港口有横幅,有些没有

我正在尝试获取连接到端口后立即显示的横幅。在本例中,
SSH-2.0-OpenSSH_7.9
但是下面的代码并没有给我任何信息,也没有错误

我在想我哪里出了问题

    banner := make([]byte, 0, 256)

    connStr := net.JoinHostPort(host, port);

    dialer := net.Dialer{Timeout: 3 * time.Second}

    conn, err := dialer.Dial("tcp", connStr)
            if err != nil {
                io.WriteString(w,err.Error())
            } else {
                n, err := conn.Read(banner);
                if err != nil {
                    log.Println(w, "read error: %v", err)
                }   
                log.Println(string(banner))
                io.WriteString(w, "Connected to " +  connStr + ". " + string(n) + " byte output:" + string(banner))
                defer conn.Close()
            } 

你知道我做错了什么吗?还是我必须发送一些东西才能获得横幅?

答案取决于横幅是什么

如果横幅由可分辨字节分隔,则使用bufio.Reader将字节拼凑到该分隔符。设置一个截止日期,以防服务器没有响应

conn, err := dialer.Dial("tcp", connStr)
if err != nil {
    // handle error
}
defer conn.Close()
conn.SetReadDeadline(time.Now().Add(time.Second))
br := bufio.NewReader(conn)
banner, err := bf.ReadBytes(delim)
if err != nil {
     // handle error
}
如果横幅未以某种方式分隔,则读取直到超时:

conn, err := dialer.Dial("tcp", connStr)
if err != nil {
    // handle error
}
defer conn.Close()

// Read for one second or until 256 bytes are read.
conn.SetReadDeadline(time.Now().Add(time.Second))
banner := make([]byte, 256)
n, err := io.ReadFull(banner)
banner = banner[:n]

你说的“横幅”是什么意思?你到底想在这里做什么?@adrian,我想看看当我连接到一个端口时会返回什么数据。例如:telnet服务器22。通常你会得到“OpenSSH…”作为横幅。我正在尝试捕获该横幅(如果存在)。请尝试通过bufio.Reader.ReadString('\n')读取该横幅,直到看到换行。你不知道你要读多少,你需要某种分隔符来停止阅读。你的横幅上有len 0,所以永远不会有任何内容被读取。@Volker你知道了!我错了!非常感谢。我会试试这个,然后再打给你。对不起,我的答复耽搁了。我将在测试后不久将您的答案标记为正确。结果表明,我的问题是字节片的长度为0。这是我的打字错误。@anoopb这是一个问题。另一个问题是,代码错误地假设横幅将在单个读取调用中读取。