1package dns 2 3import ( 4 "net" 5) 6 7func setUDPSocketOptions(conn *net.UDPConn) error { return nil } 8 9// SessionUDP holds the remote address and the associated 10// out-of-band data. 11type SessionUDP struct { 12 raddr *net.UDPAddr 13 context []byte 14} 15 16// RemoteAddr returns the remote network address. 17func (s *SessionUDP) RemoteAddr() net.Addr { return s.raddr } 18 19// ReadFromSessionUDP acts just like net.UDPConn.ReadFrom(), but returns a session object instead of a 20// net.UDPAddr. 21func ReadFromSessionUDP(conn *net.UDPConn, b []byte) (int, *SessionUDP, error) { 22 oob := make([]byte, 40) 23 n, oobn, _, raddr, err := conn.ReadMsgUDP(b, oob) 24 if err != nil { 25 return n, nil, err 26 } 27 return n, &SessionUDP{raddr, oob[:oobn]}, err 28} 29 30// WriteToSessionUDP acts just like net.UDPConn.WritetTo(), but uses a *SessionUDP instead of a net.Addr. 31func WriteToSessionUDP(conn *net.UDPConn, b []byte, session *SessionUDP) (int, error) { 32 n, _, err := conn.WriteMsgUDP(b, session.context, session.raddr) 33 return n, err 34} 35