mirror of
https://github.com/kubenetworks/kubevpn.git
synced 2025-10-08 00:30:29 +08:00
71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package core
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
"io"
|
|
"net"
|
|
|
|
"github.com/wencaiwulue/kubevpn/pkg/config"
|
|
)
|
|
|
|
type datagramPacket struct {
|
|
DataLength uint16 // [2]byte
|
|
Data []byte // []byte
|
|
}
|
|
|
|
func (addr *datagramPacket) String() string {
|
|
if addr == nil {
|
|
return ""
|
|
}
|
|
return fmt.Sprintf("DataLength: %d, Data: %v\n", addr.DataLength, addr.Data)
|
|
}
|
|
|
|
func newDatagramPacket(data []byte) (r *datagramPacket) {
|
|
return &datagramPacket{
|
|
DataLength: uint16(len(data)),
|
|
Data: data,
|
|
}
|
|
}
|
|
|
|
func (addr *datagramPacket) Addr() net.Addr {
|
|
var server8422, _ = net.ResolveUDPAddr("udp", "127.0.0.1:8422")
|
|
return server8422
|
|
}
|
|
|
|
func readDatagramPacket(r io.Reader, b []byte) (*datagramPacket, error) {
|
|
_, err := io.ReadFull(r, b[:2])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
dataLength := binary.BigEndian.Uint16(b[:2])
|
|
_, err = io.ReadFull(r, b[:dataLength])
|
|
if err != nil /*&& (err != io.ErrUnexpectedEOF || err != io.EOF)*/ {
|
|
return nil, err
|
|
}
|
|
return &datagramPacket{DataLength: dataLength, Data: b[:dataLength]}, nil
|
|
}
|
|
|
|
// this method will return all byte array in the way: b[:]
|
|
func readDatagramPacketServer(r io.Reader, b []byte) (*datagramPacket, error) {
|
|
_, err := io.ReadFull(r, b[:2])
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
dataLength := binary.BigEndian.Uint16(b[:2])
|
|
_, err = io.ReadFull(r, b[:dataLength])
|
|
if err != nil /*&& (err != io.ErrUnexpectedEOF || err != io.EOF)*/ {
|
|
return nil, err
|
|
}
|
|
return &datagramPacket{DataLength: dataLength, Data: b[:]}, nil
|
|
}
|
|
|
|
func (addr *datagramPacket) Write(w io.Writer) error {
|
|
b := config.LPool.Get().([]byte)[:]
|
|
defer config.LPool.Put(b[:])
|
|
binary.BigEndian.PutUint16(b[:2], uint16(len(addr.Data)))
|
|
n := copy(b[2:], addr.Data)
|
|
_, err := w.Write(b[:n+2])
|
|
return err
|
|
}
|