你在学习golang相关的知识吗?本文《识别端口对应的服务》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!问题内容我正在
你在学习golang相关的知识吗?本文《识别端口对应的服务》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!
问题内容我正在编写简单的网络扫描器,并坚持通过端口号解析服务名称。最好的方法是什么?我认为它应该类似于 python 的 Socket.getservbyport()
并创建了这个库,但不幸的是开发环境基于 windows,而且我想要内置解决方案而不是解析器。
package main
import (
"fmt"
"net"
"strings"
"sync"
"time"
)
type PortScanner struct {
ip string
}
func ScanPort(ip string, port int, timeout time.Duration) {
target := fmt.Sprintf("%s:%d", ip, port)
conn, err := net.DialTimeout("tcp", target, timeout)
if err != nil {
if strings.Contains(err.Error(), "too many open files") {
time.Sleep(timeout)
ScanPort(ip, port, timeout)
}
return
}
if err = conn.Close(); err != nil {
fmt.Println(err)
}
fmt.Println(port, "open")
}
func (ps *PortScanner) Start(f, l int, timeout time.Duration) {
wg := sync.WaitGroup{}
defer wg.Wait()
for port := f; port <= l; port++ {
wg.Add(1)
Go func(port int) {
defer wg.Done()
ScanPort(ps.ip, port, timeout)
}(port)
}
}
func main() {
ps := &PortScanner{ip: "127.0.0.1"}
ps.Start(1, 65535, 500*time.Millisecond)
}
您可以修改该 netdb 库中的代码以加载您提供的 services
文件 instead of /etc/services
。
也许更好,因为这本质上只是一个键/值映射,所以创建一个 ports.go
文件:
var tcpports = map[int]string{
80: "Http"
// ...
}
然后进行常规地图查找。
要列出所有 tcp 端口,您可以执行以下操作:
$ sed -E '/tcp$/!d; s!^([a-zA-Z0-9\-]+)\s+([0-9]+)/\w+!\t\2: "\1",!;' /etc/services
1: "tcpmux",
2: "compressnet",
3: "compressnet",
5: "rje",
7: "echo",
9: "discard",
11: "systat",
13: "daytime",
17: "qotd",
19: "chargen",
.. many more ..
到这里,我们也就讲完了《识别端口对应的服务》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注编程网公众号,带你了解更多关于的知识点!
--结束END--
本文标题: 识别端口对应的服务
本文链接: https://lsjlt.com/news/595638.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0