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



我使用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。读卡器将字节拖到该分隔符。设置一个截止日期,以防服务器没有响应。

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]

最新更新