123456789101112131415161718192021222324252627282930313233343536373839 |
- package arping
- import (
- "net"
- "syscall"
- "time"
- )
- var sock int
- var toSockaddr syscall.SockaddrLinklayer
- func initialize(iface net.Interface) error {
- toSockaddr = syscall.SockaddrLinklayer{Ifindex: iface.Index}
- // 1544 = htons(ETH_P_ARP)
- const proto = 1544
- var err error
- sock, err = syscall.Socket(syscall.AF_PACKET, syscall.SOCK_RAW, proto)
- return err
- }
- func send(request arpDatagram) (time.Time, error) {
- return time.Now(), syscall.Sendto(sock, request.MarshalWithEthernetHeader(), 0, &toSockaddr)
- }
- func receive() (arpDatagram, time.Time, error) {
- buffer := make([]byte, 128)
- n, _, err := syscall.Recvfrom(sock, buffer, 0)
- if err != nil {
- return arpDatagram{}, time.Now(), err
- }
- // skip 14 bytes ethernet header
- return parseArpDatagram(buffer[14:n]), time.Now(), nil
- }
- func deinitialize() error {
- return syscall.Close(sock)
- }
|