sockets - 在 GO 中通过原始套接字读取 TCP 数据包

标签 sockets go

我正在研究 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 库来完成这项工作。

https://godoc.org/code.google.com/p/gopacket/pcap

关于sockets - 在 GO 中通过原始套接字读取 TCP 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28903420/

相关文章:

go - 从 exec.Command 写入文件

linux - 两个进程共享UDP套接字,其中一个进程重启后停止接收消息

c - 为什么必须在套接字函数中传递 sizeof?

mongodb - 将 MongoDB 函数 foreach 转换为 mgo (Golang) 函数

go - 如何以正确的方式将 float64 数字更改为 uint64?

go - 了解原子添加和互斥量

go - 从 Go 中的 main 导入本地包

sockets - 如何使用 C 中的套接字读取流的 TCP 数据包?

java - 简单的 Web 服务器在收到 http 请求时挂起

java - 多个 ObjectOutputStream 和 ObjectInputStream 出错(套接字已关闭)