@@ -29,7 +29,6 @@ import (
2929 "github.com/panjf2000/gnet/v2/pkg/buffer/elastic"
3030 errorx "github.com/panjf2000/gnet/v2/pkg/errors"
3131 gio "github.com/panjf2000/gnet/v2/pkg/io"
32- "github.com/panjf2000/gnet/v2/pkg/logging"
3332 "github.com/panjf2000/gnet/v2/pkg/netpoll"
3433 bsPool "github.com/panjf2000/gnet/v2/pkg/pool/byteslice"
3534 "github.com/panjf2000/gnet/v2/pkg/queue"
@@ -158,11 +157,7 @@ loop:
158157 }
159158 return
160159 }
161- if err := c .loop .close (c , os .NewSyscallError ("write" , err )); err != nil {
162- logging .Errorf ("failed to close connection(fd=%d,remote=%+v) on conn.write: %v" ,
163- c .fd , c .remoteAddr , err )
164- }
165- return 0 , os .NewSyscallError ("write" , err )
160+ return 0 , c .loop .close (c , os .NewSyscallError ("write" , err ))
166161 }
167162 data = data [sent :]
168163 if isET && len (data ) > 0 {
@@ -206,11 +201,7 @@ loop:
206201 }
207202 return
208203 }
209- if err := c .loop .close (c , os .NewSyscallError ("writev" , err )); err != nil {
210- logging .Errorf ("failed to close connection(fd=%d,remote=%+v) on conn.writev: %v" ,
211- c .fd , c .remoteAddr , err )
212- }
213- return 0 , os .NewSyscallError ("writev" , err )
204+ return 0 , c .loop .close (c , os .NewSyscallError ("writev" , err ))
214205 }
215206 pos := len (bs )
216207 if remaining -= sent ; remaining > 0 {
@@ -280,11 +271,20 @@ func (c *conn) asyncWritev(a any) (err error) {
280271 return
281272}
282273
283- func (c * conn ) sendTo (buf []byte ) error {
284- if c .remote == nil {
285- return unix .Send (c .fd , buf , 0 )
274+ func (c * conn ) sendTo (buf []byte , addr unix.Sockaddr ) (n int , err error ) {
275+ defer func () {
276+ if err != nil {
277+ n = 0
278+ }
279+ }()
280+
281+ if addr != nil {
282+ return len (buf ), unix .Sendto (c .fd , buf , 0 , addr )
283+ }
284+ if c .remote == nil { // connected UDP socket of client
285+ return len (buf ), unix .Send (c .fd , buf , 0 )
286286 }
287- return unix .Sendto (c .fd , buf , 0 , c .remote )
287+ return len ( buf ), unix .Sendto (c .fd , buf , 0 , c .remote ) // unconnected UDP socket of server
288288}
289289
290290func (c * conn ) resetBuffer () {
@@ -389,14 +389,24 @@ func (c *conn) Discard(n int) (int, error) {
389389
390390func (c * conn ) Write (p []byte ) (int , error ) {
391391 if c .isDatagram {
392- if err := c .sendTo (p ); err != nil {
393- return 0 , err
394- }
395- return len (p ), nil
392+ return c .sendTo (p , nil )
396393 }
397394 return c .write (p )
398395}
399396
397+ func (c * conn ) SendTo (p []byte , addr net.Addr ) (int , error ) {
398+ if ! c .isDatagram {
399+ return 0 , errorx .ErrUnsupportedOp
400+ }
401+
402+ sa := socket .NetAddrToSockaddr (addr )
403+ if sa == nil {
404+ return 0 , errorx .ErrInvalidNetworkAddress
405+ }
406+
407+ return c .sendTo (p , sa )
408+ }
409+
400410func (c * conn ) Writev (bs [][]byte ) (int , error ) {
401411 if c .isDatagram {
402412 return 0 , errorx .ErrUnsupportedOp
@@ -462,7 +472,7 @@ func (c *conn) SetKeepAlivePeriod(d time.Duration) error {
462472
463473func (c * conn ) AsyncWrite (buf []byte , callback AsyncCallback ) error {
464474 if c .isDatagram {
465- err := c .sendTo (buf )
475+ _ , err := c .sendTo (buf , nil )
466476 // TODO: it will not go asynchronously with UDP, so calling a callback is needless,
467477 // we may remove this branch in the future, please don't rely on the callback
468478 // to do something important under UDP, if you're working with UDP, just call Conn.Write
0 commit comments