@@ -6,6 +6,7 @@ package net
6
6
7
7
import (
8
8
"context"
9
+ "io"
9
10
"syscall"
10
11
)
11
12
@@ -171,6 +172,37 @@ func (c *UDPConn) WriteTo(b []byte, addr Addr) (int, error) {
171
172
return n , err
172
173
}
173
174
175
+ // WriterTo returns an io.Writer that writes UDP packets to addr.
176
+ // This is more efficient than WriteTo when many packets will be sent to the same addr.
177
+ func (c * UDPConn ) WriterTo (addr Addr ) (io.Writer , error ) {
178
+ a , ok := addr .(* UDPAddr )
179
+ if ! ok {
180
+ return nil , & OpError {Op : "write" , Net : c .fd .net , Source : c .fd .laddr , Addr : addr , Err : syscall .EINVAL }
181
+ }
182
+ sa , err := a .sockaddr (c .fd .family )
183
+ if err != nil {
184
+ return nil , err
185
+ }
186
+ return & udpWriterTo {c , a , sa }, nil
187
+ }
188
+
189
+ type udpWriterTo struct {
190
+ conn * UDPConn
191
+ addr * UDPAddr
192
+ sa syscall.Sockaddr
193
+ }
194
+
195
+ func (c * udpWriterTo ) Write (b []byte ) (int , error ) {
196
+ if ! c .conn .ok () {
197
+ return 0 , syscall .EINVAL
198
+ }
199
+ n , err := c .writeTo (b , c .sa )
200
+ if err != nil {
201
+ err = & OpError {Op : "write" , Net : c .conn .fd .net , Source : c .conn .fd .laddr , Addr : c .addr .opAddr (), Err : err }
202
+ }
203
+ return n , err
204
+ }
205
+
174
206
// WriteMsgUDP writes a message to addr via c if c isn't connected, or
175
207
// to c's remote address if c is connected (in which case addr must be
176
208
// nil). The payload is copied from b and the associated out-of-band
0 commit comments