github.com/database64128/shadowsocks-go@v1.7.0/conn/sockaddr_linuxsolaris.go (about) 1 //go:build linux || solaris 2 3 package conn 4 5 import ( 6 "net/netip" 7 "unsafe" 8 9 "golang.org/x/sys/unix" 10 ) 11 12 func AddrPortToSockaddrValue(addrPort netip.AddrPort) (rsa6 unix.RawSockaddrInet6, namelen uint32) { 13 addr, port := addrPort.Addr(), addrPort.Port() 14 p := (*[2]byte)(unsafe.Pointer(&rsa6.Port)) 15 p[0] = byte(port >> 8) 16 p[1] = byte(port) 17 if addr.Is4() { 18 rsa6.Family = unix.AF_INET 19 a := (*[4]byte)(unsafe.Pointer(&rsa6.Flowinfo)) 20 *a = addr.As4() 21 namelen = unix.SizeofSockaddrInet4 22 return 23 } 24 rsa6.Family = unix.AF_INET6 25 rsa6.Addr = addr.As16() 26 namelen = unix.SizeofSockaddrInet6 27 return 28 } 29 30 func AddrPortToSockaddrInet4(addrPort netip.AddrPort) unix.RawSockaddrInet4 { 31 addr := addrPort.Addr() 32 port := addrPort.Port() 33 rsa4 := unix.RawSockaddrInet4{ 34 Family: unix.AF_INET, 35 Addr: addr.As4(), 36 } 37 p := (*[2]byte)(unsafe.Pointer(&rsa4.Port)) 38 p[0] = byte(port >> 8) 39 p[1] = byte(port) 40 return rsa4 41 } 42 43 func AddrPortToSockaddrInet6(addrPort netip.AddrPort) unix.RawSockaddrInet6 { 44 addr := addrPort.Addr() 45 port := addrPort.Port() 46 rsa6 := unix.RawSockaddrInet6{ 47 Family: unix.AF_INET6, 48 Addr: addr.As16(), 49 } 50 p := (*[2]byte)(unsafe.Pointer(&rsa6.Port)) 51 p[0] = byte(port >> 8) 52 p[1] = byte(port) 53 return rsa6 54 }