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