|
|
@@ -4,7 +4,11 @@
|
|
|
|
|
|
package windows
|
|
|
|
|
|
-import "syscall"
|
|
|
+import (
|
|
|
+ "net"
|
|
|
+ "syscall"
|
|
|
+ "unsafe"
|
|
|
+)
|
|
|
|
|
|
const (
|
|
|
// Invented values to support what package os expects.
|
|
|
@@ -1314,6 +1318,16 @@ type SocketAddress struct {
|
|
|
SockaddrLength int32
|
|
|
}
|
|
|
|
|
|
+// IP returns an IPv4 or IPv6 address, or nil if the underlying SocketAddress is neither.
|
|
|
+func (addr *SocketAddress) IP() net.IP {
|
|
|
+ if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet4{}) && addr.Sockaddr.Addr.Family == AF_INET {
|
|
|
+ return (*RawSockaddrInet4)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
|
|
|
+ } else if uintptr(addr.SockaddrLength) >= unsafe.Sizeof(RawSockaddrInet6{}) && addr.Sockaddr.Addr.Family == AF_INET6 {
|
|
|
+ return (*RawSockaddrInet6)(unsafe.Pointer(addr.Sockaddr)).Addr[:]
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|
|
|
+
|
|
|
type IpAdapterUnicastAddress struct {
|
|
|
Length uint32
|
|
|
Flags uint32
|