我正在研究 GO 中的原始套接字。我希望能够读取所有发送到我的计算机的 TCP 数据包(OSX,en0:192.168.1.65)
如果我将协议(protocol)从 tcp 切换到 icmp,我将收到数据包。为什么我的代码没有读取任何数据包?
package main
import (
"fmt"
"net"
)
func main() {
netaddr, err := net.ResolveIPAddr("ip4", "192.168.1.65")
if err != nil {
fmt.Println(err)
}
conn, err := net.ListenIP("ip4:tcp", netaddr)
if err != nil {
fmt.Println(err)
}
buf := make([]byte, 2048)
for {
numRead, recvAddr, err := conn.ReadFrom(buf)
if err != nil {
fmt.Println(err)
}
if recvAddr != nil {
fmt.Println(recvAddr)
}
s := string(buf[:numRead])
fmt.Println(s)
}
}
最佳答案
问题在于 OS X 基于 BSD,而 BSD 不允许您在 TCP 级别对原始套接字进行编程。为此,您必须使用下到以太网级别。
我正在使用带有 gopackets 的 pcap 库来完成这项工作。
关于sockets - 在 GO 中通过原始套接字读取 TCP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28903420/