go raw socket无法接收tcp数据问题(mac系统下)

测试demo如下:

package main

import (
"fmt"
"net"
)

func main() {
    ipaddr   := "127.0.0.1"
    netaddr, err := net.ResolveIPAddr("ip4", padder)
    if err != nil {
        fmt.Println(err)
    }

    conn, err := net.ListenIP("ip4:tcp", netaddr)
    if err != nil {
        fmt.Println(err)
    }

    buf := make([]byte, 1024)
    for {
        numRead, recvAddr, err := conn.ReadFrom(buf)
        if err != nil {
            fmt.Println(err)
        }
        if recvAddr != nil {
            fmt.Printf("raddr: %v\n", raddr)
        }
        s := string(buf[:numRead])
        fmt.Println(s)
    }
}

在mac机器上,一个终端中运行go run main.go, 打开另一个终端用行curl 127.0.0.1 , 永远阻塞在ReadFrom那里。

mac 下测试

google之后才发现,go中raw socket只支持linux类型系统,不知道windows, BSD系统,所以有三个解决方法:

  1. 使用pcap进行实现该功能(这个可以)
  2. 使用Ethernet级别去实现(没有尝试)
  3. 换linux系统进行尝试
换linux系统进行尝试

查看go1.14源码信息:


支持平台

参考:

  • Reading TCP packets via raw sockets in GO
  • Golang 文件名命名规则

你可能感兴趣的:(go raw socket无法接收tcp数据问题(mac系统下))