@@ -372,7 +372,11 @@ static void nio_write(hio_t* io) {
372372 char * base = pbuf -> base ;
373373 char * buf = base + pbuf -> offset ;
374374 int len = pbuf -> len - pbuf -> offset ;
375- nwrite = __nio_write (io , buf , len , NULL );
375+ struct sockaddr * addr = NULL ;
376+ if (io -> io_type & (HIO_TYPE_SOCK_DGRAM | HIO_TYPE_SOCK_RAW )) {
377+ addr = (struct sockaddr * )base ;
378+ }
379+ nwrite = __nio_write (io , buf , len , addr );
376380 // printd("write retval=%d\n", nwrite);
377381 if (nwrite < 0 ) {
378382 err = socket_errno ();
@@ -526,26 +530,34 @@ static int hio_write4 (hio_t* io, const void* buf, size_t len, struct sockaddr*
526530 hio_add (io , hio_handle_events , HV_WRITE );
527531 }
528532 if (nwrite < len ) {
529- if (io -> write_bufsize + len - nwrite > io -> max_write_bufsize ) {
533+ size_t unwritten_len = len - nwrite ;
534+ if (io -> write_bufsize + unwritten_len > io -> max_write_bufsize ) {
530535 hloge ("write bufsize > %u, close it!" , io -> max_write_bufsize );
531536 io -> error = ERR_OVER_LIMIT ;
532537 goto write_error ;
533538 }
539+ size_t addrlen = 0 ;
540+ if ((io -> io_type & (HIO_TYPE_SOCK_DGRAM | HIO_TYPE_SOCK_RAW )) && addr ) {
541+ addrlen = SOCKADDR_LEN (addr );
542+ }
534543 offset_buf_t remain ;
535- remain .len = len - nwrite ;
536- remain .offset = 0 ;
544+ remain .offset = addrlen ;
545+ remain .len = addrlen + unwritten_len ;
537546 // NOTE: free in nio_write
538547 HV_ALLOC (remain .base , remain .len );
539- memcpy (remain .base , ((char * )buf ) + nwrite , remain .len );
548+ if (addr && addrlen > 0 ) {
549+ memcpy (remain .base , addr , addrlen );
550+ }
551+ memcpy (remain .base + remain .offset , ((char * )buf ) + nwrite , unwritten_len );
540552 if (io -> write_queue .maxsize == 0 ) {
541553 write_queue_init (& io -> write_queue , 4 );
542554 }
543555 write_queue_push_back (& io -> write_queue , & remain );
544- io -> write_bufsize += remain . len ;
556+ io -> write_bufsize += unwritten_len ;
545557 if (io -> write_bufsize > WRITE_BUFSIZE_HIGH_WATER ) {
546558 hlogw ("write len=%u enqueue %u, bufsize=%u over high water %u" ,
547559 (unsigned int )len ,
548- (unsigned int )( remain . len - remain . offset ) ,
560+ (unsigned int )unwritten_len ,
549561 (unsigned int )io -> write_bufsize ,
550562 (unsigned int )WRITE_BUFSIZE_HIGH_WATER );
551563 }
@@ -571,11 +583,11 @@ static int hio_write4 (hio_t* io, const void* buf, size_t len, struct sockaddr*
571583}
572584
573585int hio_write (hio_t * io , const void * buf , size_t len ) {
574- return hio_write4 (io , buf , len , NULL );
586+ return hio_write4 (io , buf , len , io -> peeraddr );
575587}
576588
577589int hio_sendto (hio_t * io , const void * buf , size_t len , struct sockaddr * addr ) {
578- return hio_write4 (io , buf , len , addr );
590+ return hio_write4 (io , buf , len , addr ? addr : io -> peeraddr );
579591}
580592
581593int hio_close (hio_t * io ) {
0 commit comments