为什么使用 ETH_P_ALL 的所有协议都没有通过原始套接字接收数据包?

问题描述 投票:0回答:1
package main
import (
"fmt"
"syscall"
)
func main() { ` 
  fd, err:= syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, syscall.ETH_P_ALL) //opening raw socket
  if (err != nil) {
    fmt.Println("Error: " + err.Error())
    return;
  }
  fmt.Println("Obtained fd ", fd)
  defer syscall.Close(fd)


  sa:= &syscall.SockaddrInet4{
        Addr: [4]byte{10,75,24,6}, //defining my IP
        }
    e := syscall.Bind(fd, sa)  //binding my IP
    if e != nil {
        fmt.Println(e)   
         }   
   fmt.Println("Entering main loop")
    for {
        buf := make([]byte, 1024)
        numRead, err,_ := syscall.Recvfrom(fd,buf,0)   //reading the packets via raw sockets
        if err != nil {
            fmt.Println("error")
                }
        fmt.Printf("%X\n",buf[:numRead])
    }
}`

我试图在原始套接字中使用

ETH_P_ALL
接收来自所有协议的数据包。但我无法接收数据包。此代码是用 GoLang 编写的。你们能帮我解决一下吗

go bind system-calls packet raw-sockets
1个回答
0
投票

也许当你在

syscall.ETH_P_ALL
中使用
syscall.Socket()
时,你应该绑定相应的套接字地址,即
syscall.SockaddrLinklayer

© www.soinside.com 2019 - 2024. All rights reserved.