通过GO中的原始套接字读取TCP数据包

时间:2015-03-06 16:41:17

标签: sockets go

我正在研究GO中的原始套接字。我希望能够读取所有进入我计算机的TCP数据包(OSX,en0:192.168.1.65)

如果我将协议从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)
    }
}

1 个答案:

答案 0 :(得分:1)

问题在于OS X基于BSD,而BSD不允许您在TCP级别编程原始套接字。您必须使用下载到以太网级别才能执行此操作。

我正在使用带有gopackets的pcap库来完成这项工作。

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