Skip to content

Commit 5001c07

Browse files
committed
feat: support nonblocking sendto multiple peeraddr (#707)
1 parent 1e3dd55 commit 5001c07

3 files changed

Lines changed: 24 additions & 17 deletions

File tree

event/hevent.c

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,7 @@ static void fill_io_type(hio_t* io) {
4343
}
4444

4545
static void hio_socket_init(hio_t* io) {
46-
if ((io->io_type & HIO_TYPE_SOCK_DGRAM) || (io->io_type & HIO_TYPE_SOCK_RAW)) {
47-
// NOTE: sendto multiple peeraddr cannot use io->write_queue
48-
blocking(io->fd);
49-
} else {
50-
nonblocking(io->fd);
51-
}
46+
nonblocking(io->fd);
5247
// fill io->localaddr io->peeraddr
5348
if (io->localaddr == NULL) {
5449
HV_ALLOC(io->localaddr, sizeof(sockaddr_u));

event/nio.c

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

573585
int 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

577589
int 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

581593
int hio_close (hio_t* io) {

event/overlapio.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -380,11 +380,11 @@ static int hio_write4 (hio_t* io, const void* buf, size_t len, struct sockaddr*
380380
}
381381

382382
int hio_write (hio_t* io, const void* buf, size_t len) {
383-
return hio_write4(io, buf, len, NULL);
383+
return hio_write4(io, buf, len, io->peeraddr);
384384
}
385385

386386
int hio_sendto (hio_t* io, const void* buf, size_t len, struct sockaddr* addr) {
387-
return hio_write4(io, buf, len, addr);
387+
return hio_write4(io, buf, len, addr ? addr : io->peeraddr);
388388
}
389389

390390
int hio_close (hio_t* io) {

0 commit comments

Comments
 (0)