golang连接NetBIOS Name service通信协议
NetBIOS Name Service (NBNS)是一种用于在局域网中解析NetBIOS名称的协议。在Go语言中,可以使用net包中的UDPConn类型来实现NBNS通信协议。
首先,需要创建一个UDP连接:
conn, err := net.DialUDP("udp", nil, &net.UDPAddr{IP: net.IPv4(255, 255, 255, 255), Port: 137})
if err != nil {
log.Fatal(err)
}
defer conn.Close()
这里使用了DialUDP函数来创建一个UDP连接,将目标IP地址设置为255.255.255.255,端口号为137,这是NBNS协议的默认端口号。
接下来,可以使用Write方法向NBNS服务器发送查询请求:
name := "MYCOMPUTER"
buf := make([]byte, 50)
buf[0] = 0x11 // NBNS header
buf[1] = 0x00 // NBNS header
buf[2] = 0x00 // NBNS header
buf[3] = 0x00 // NBNS header
buf[4] = 0x00 // NBNS header
buf[5] = 0x01 // NBNS header
buf[6] = 0x00 // NBNS header
buf[7] = 0x00 // NBNS header
buf[8] = 0x00 // NBNS header
buf[9] = 0x00 // NBNS header
buf[10] = 0x00 // NBNS header
buf[11] = 0x00 // NBNS header
buf[12] = 0x20 // NBNS header
buf[13] = 0x43 // NBNS header
buf[14] = 0x4B // NBNS header
buf[15] = 0x41 // NBNS header
buf[16] = 0x41 // NBNS header
buf[17] = 0x41 // NBNS header
buf[18] = 0x41 // NBNS header
buf[19] = 0x41 // NBNS header
buf[20] = 0x41 // NBNS header
buf[21] = 0x41 // NBNS header
buf[22] = 0x41 // NBNS header
buf[23] = 0x41 // NBNS header
buf[24] = 0x41 // NBNS header
buf[25] = 0x41 // NBNS header
buf[26] = 0x41 // NBNS header
buf[27] = 0x41 // NBNS header
buf[28] = 0x41 // NBNS header
buf[29] = 0x41 // NBNS header
buf[30] = 0x41 // NBNS header
buf[31] = 0x41 // NBNS header
buf[32] = 0x41 // NBNS header
buf[33] = 0x41 // NBNS header
buf[34] = 0x41 // NBNS header
buf[35] = 0x41 // NBNS header
buf[36] = 0x41 // NBNS header
buf[37] = 0x41 // NBNS header
buf[38] = 0x41 // NBNS header
buf[39] = 0x41 // NBNS header
buf[40] = 0x41 // NBNS header
buf[41] = 0x41 // NBNS header
buf[42] = 0x41 // NBNS header
buf[43] = 0x41 // NBNS header
buf[44] = 0x41 // NBNS header
buf[45] = 0x41 // NBNS header
buf[46] = 0x41 // NBNS header
buf[47] = 0x41 // NBNS header
buf[48] = 0x41 // NBNS header
buf[49] = 0x00 // NBNS header
_, err = conn.Write(buf)
if err != nil {
log.Fatal(err)
}
这里使用了一个长度为50的字节数组来构造查询请求,其中前12个字节是NBNS协议的头部,后面的字符串是要查询的NetBIOS名称。可以根据实际情况修改这个字符串。
最后,使用Read方法从NBNS服务器接收响应:
buf = make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
log.Fatal(err)
}
这里使用了一个长度为1024的字节数组来接收响应,可以根据实际情况调整数组长度。读取到的数据存储在buf中,可以根据实际情况解析这些数据。
完整的代码示例:
package main
import (
"log"
"net"
)
func main() {
conn, err := net.DialUDP("udp", nil, &net.UDPAddr{IP: net.IPv4(255, 255, 255, 255), Port: 137})
if err != nil {
log.Fatal(err)
}
defer conn.Close()
name := "MYCOMPUTER"
buf := make([]byte, 50)
buf[0] = 0x11 // NBNS header
buf[1] = 0x00 // NBNS header
buf[2] = 0x00 // NBNS header
buf[3] = 0x00 // NBNS header
buf[4] = 0x00 // NBNS header
buf[5] = 0x01 // NBNS header
buf[6] = 0x00 // NBNS header
buf[7] = 0x00 // NBNS header
buf[8] = 0x00 // NBNS header
buf[9] = 0x00 // NBNS header
buf[10] = 0x00 // NBNS header
buf[11] = 0x00 // NBNS header
buf[12] = 0x20 // NBNS header
buf[13] = 0x43 // NBNS header
buf[14] = 0x4B // NBNS header
buf[15] = 0x41 // NBNS header
buf[16] = 0x41 // NBNS header
buf[17] = 0x41 // NBNS header
buf[18] = 0x41 // NBNS header
buf[19] = 0x41 // NBNS header
buf[20] = 0x41 // NBNS header
buf[21] = 0x41 // NBNS header
buf[22] = 0x41 // NBNS header
buf[23] = 0x41 // NBNS header
buf[24] = 0x41 // NBNS header
buf[25] = 0x41 // NBNS header
buf[26] = 0x41 // NBNS header
buf[27] = 0x41 // NBNS header
buf[28] = 0x41 // NBNS header
buf[29] = 0x41 // NBNS header
buf[30] = 0x41 // NBNS header
buf[31] = 0x41 // NBNS header
buf[32] = 0x41 // NBNS header
buf[33] = 0x41 // NBNS header
buf[34] = 0x41 // NBNS header
buf[35] = 0x41 // NBNS header
buf[36] = 0x41 // NBNS header
buf[37] = 0x41 // NBNS header
buf[38] = 0x41 // NBNS header
buf[39] = 0x41 // NBNS header
buf[40] = 0x41 // NBNS header
buf[41] = 0x41 // NBNS header
buf[42] = 0x41 // NBNS header
buf[43] = 0x41 // NBNS header
buf[44] = 0x41 // NBNS header
buf[45] = 0x41 // NBNS header
buf[46] = 0x41 // NBNS header
buf[47] = 0x41 // NBNS header
buf[48] = 0x41 // NBNS header
buf[49] = 0x00 // NBNS header
_, err = conn.Write(buf)
if err != nil {
log.Fatal(err)
}
buf = make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
log.Fatal(err)
}
log.Printf("Received %d bytes: %v", n, buf[:n])
}
原文地址: https://www.cveoy.top/t/topic/b21C 著作权归作者所有。请勿转载和采集!