@@ -269,7 +269,7 @@ static int __nio_read(hio_t* io, void* buf, int len) {
269269 return nread ;
270270}
271271
272- static int __nio_write (hio_t * io , const void * buf , int len ) {
272+ static int __nio_write (hio_t * io , const void * buf , int len , struct sockaddr * addr ) {
273273 int nwrite = 0 ;
274274 switch (io -> io_type ) {
275275 case HIO_TYPE_SSL :
@@ -288,7 +288,8 @@ static int __nio_write(hio_t* io, const void* buf, int len) {
288288 case HIO_TYPE_KCP :
289289 case HIO_TYPE_IP :
290290 {
291- nwrite = sendto (io -> fd , buf , len , 0 , io -> peeraddr , SOCKADDR_LEN (io -> peeraddr ));
291+ if (addr == NULL ) addr = io -> peeraddr ;
292+ nwrite = sendto (io -> fd , buf , len , 0 , addr , SOCKADDR_LEN (addr ));
292293 if (((sockaddr_u * )io -> localaddr )-> sin .sin_port == 0 ) {
293294 socklen_t addrlen = sizeof (sockaddr_u );
294295 getsockname (io -> fd , io -> localaddr , & addrlen );
@@ -371,7 +372,7 @@ static void nio_write(hio_t* io) {
371372 char * base = pbuf -> base ;
372373 char * buf = base + pbuf -> offset ;
373374 int len = pbuf -> len - pbuf -> offset ;
374- nwrite = __nio_write (io , buf , len );
375+ nwrite = __nio_write (io , buf , len , NULL );
375376 // printd("write retval=%d\n", nwrite);
376377 if (nwrite < 0 ) {
377378 err = socket_errno ();
@@ -485,7 +486,7 @@ int hio_read (hio_t* io) {
485486 return 0 ;
486487}
487488
488- int hio_write (hio_t * io , const void * buf , size_t len ) {
489+ static int hio_write4 (hio_t * io , const void * buf , size_t len , struct sockaddr * addr ) {
489490 if (io -> closed ) {
490491 hloge ("hio_write called but fd[%d] already closed!" , io -> fd );
491492 return -1 ;
@@ -501,7 +502,7 @@ int hio_write (hio_t* io, const void* buf, size_t len) {
501502#endif
502503 if (write_queue_empty (& io -> write_queue )) {
503504try_write :
504- nwrite = __nio_write (io , buf , len );
505+ nwrite = __nio_write (io , buf , len , addr );
505506 // printd("write retval=%d\n", nwrite);
506507 if (nwrite < 0 ) {
507508 err = socket_errno ();
@@ -569,6 +570,14 @@ int hio_write (hio_t* io, const void* buf, size_t len) {
569570 return nwrite < 0 ? nwrite : -1 ;
570571}
571572
573+ int hio_write (hio_t * io , const void * buf , size_t len ) {
574+ return hio_write4 (io , buf , len , NULL );
575+ }
576+
577+ int hio_sendto (hio_t * io , const void * buf , size_t len , struct sockaddr * addr ) {
578+ return hio_write4 (io , buf , len , addr );
579+ }
580+
572581int hio_close (hio_t * io ) {
573582 if (io -> closed ) return 0 ;
574583 if (io -> destroy == 0 && hv_gettid () != io -> loop -> tid ) {
0 commit comments