packetaddr.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package packetaddr
  2. import (
  3. "bytes"
  4. "github.com/v2fly/v2ray-core/v4/common/buf"
  5. "github.com/v2fly/v2ray-core/v4/common/net"
  6. "github.com/v2fly/v2ray-core/v4/common/protocol"
  7. gonet "net"
  8. )
  9. var addrParser = protocol.NewAddressParser(
  10. protocol.AddressFamilyByte(0x01, net.AddressFamilyIPv4),
  11. protocol.AddressFamilyByte(0x02, net.AddressFamilyIPv6),
  12. )
  13. func AttachAddressToPacket(data []byte, address gonet.Addr) []byte {
  14. packetBuf := buf.StackNew()
  15. udpaddr := address.(*gonet.UDPAddr)
  16. port, err := net.PortFromInt(uint32(udpaddr.Port))
  17. if err != nil {
  18. panic(err)
  19. }
  20. err = addrParser.WriteAddressPort(&packetBuf, net.IPAddress(udpaddr.IP), port)
  21. if err != nil {
  22. panic(err)
  23. }
  24. data = append(packetBuf.Bytes(), data...)
  25. packetBuf.Release()
  26. return data
  27. }
  28. func ExtractAddressFromPacket(data []byte) ([]byte, gonet.Addr) {
  29. packetBuf := buf.StackNew()
  30. address, port, err := addrParser.ReadAddressPort(&packetBuf, bytes.NewReader(data))
  31. if err != nil {
  32. panic(err)
  33. }
  34. var addr = &gonet.UDPAddr{
  35. IP: address.IP(),
  36. Port: int(port.Value()),
  37. Zone: "",
  38. }
  39. payload := data[int(packetBuf.Len()):]
  40. packetBuf.Release()
  41. return payload, addr
  42. }