测试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那里。
google之后才发现,go中raw socket只支持linux类型系统,不知道windows, BSD系统,所以有三个解决方法:
- 使用pcap进行实现该功能(这个可以)
- 使用Ethernet级别去实现(没有尝试)
- 换linux系统进行尝试
查看go1.14源码信息:
支持平台
参考:
网友评论