Skip to content

Commit 3d0233d

Browse files
committed
fix: add hio_sendto to replace hio_set_peeraddr,hio_write (#707)
1 parent 7ba055f commit 3d0233d

File tree

6 files changed

+34
-19
lines changed

6 files changed

+34
-19
lines changed

event/hloop.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ HV_EXPORT int hio_read_remain(hio_t* io);
376376
// NOTE: hio_write is thread-safe, locked by recursive_mutex, allow to be called by other threads.
377377
// hio_try_write => hio_add(io, HV_WRITE) => write => hwrite_cb
378378
HV_EXPORT int hio_write (hio_t* io, const void* buf, size_t len);
379+
HV_EXPORT int hio_sendto (hio_t* io, const void* buf, size_t len, struct sockaddr* addr);
379380

380381
// NOTE: hio_close is thread-safe, hio_close_async will be called actually in other thread.
381382
// hio_del(io, HV_RDWR) => close => hclose_cb

event/nio.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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)) {
503504
try_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+
572581
int hio_close (hio_t* io) {
573582
if (io->closed) return 0;
574583
if (io->destroy == 0 && hv_gettid() != io->loop->tid) {

event/overlapio.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -296,14 +296,15 @@ int hio_read (hio_t* io) {
296296
return hio_add(io, hio_handle_events, HV_READ);
297297
}
298298

299-
int hio_write(hio_t* io, const void* buf, size_t len) {
299+
static int hio_write4 (hio_t* io, const void* buf, size_t len, struct sockaddr* addr) {
300300
int nwrite = 0;
301301
try_send:
302302
if (io->io_type == HIO_TYPE_TCP) {
303303
nwrite = send(io->fd, buf, len, 0);
304304
}
305305
else if (io->io_type == HIO_TYPE_UDP) {
306-
nwrite = sendto(io->fd, buf, len, 0, io->peeraddr, sizeof(struct sockaddr_in6));
306+
if (addr == NULL) addr = io->peeraddr;
307+
nwrite = sendto(io->fd, buf, len, 0, addr, sizeof(struct sockaddr_in6));
307308
}
308309
else if (io->io_type == HIO_TYPE_IP) {
309310
goto WSASend;
@@ -354,7 +355,8 @@ int hio_write(hio_t* io, const void* buf, size_t len) {
354355
}
355356
else if (io->io_type == HIO_TYPE_UDP ||
356357
io->io_type == HIO_TYPE_IP) {
357-
ret = WSASendTo(io->fd, &hovlp->buf, 1, &dwbytes, flags, io->peeraddr, sizeof(struct sockaddr_in6), &hovlp->ovlp, NULL);
358+
if (addr == NULL) addr = io->peeraddr;
359+
ret = WSASendTo(io->fd, &hovlp->buf, 1, &dwbytes, flags, addr, sizeof(struct sockaddr_in6), &hovlp->ovlp, NULL);
358360
}
359361
else {
360362
ret = -1;
@@ -371,10 +373,20 @@ int hio_write(hio_t* io, const void* buf, size_t len) {
371373
}
372374
write_error:
373375
disconnect:
374-
hio_close(io);
376+
if (io->io_type & HIO_TYPE_SOCK_STREAM) {
377+
hio_close(io);
378+
}
375379
return 0;
376380
}
377381

382+
int hio_write (hio_t* io, const void* buf, size_t len) {
383+
return hio_write4(io, buf, len, NULL);
384+
}
385+
386+
int hio_sendto (hio_t* io, const void* buf, size_t len, struct sockaddr* addr) {
387+
return hio_write4(io, buf, len, addr);
388+
}
389+
378390
int hio_close (hio_t* io) {
379391
if (io->closed) return 0;
380392
io->closed = 1;

evpp/UdpClient.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,7 @@ class UdpClientEventLoopTmpl {
113113
// sendto thread-safe
114114
int sendto(const void* data, int size, struct sockaddr* peeraddr = NULL) {
115115
if (channel == NULL) return -1;
116-
std::lock_guard<std::mutex> locker(sendto_mutex);
117-
if (peeraddr) hio_set_peeraddr(channel->io(), peeraddr, SOCKADDR_LEN(peeraddr));
118-
return channel->write(data, size);
116+
return hio_sendto(channel->io(), data, size, peeraddr);
119117
}
120118
int sendto(Buffer* buf, struct sockaddr* peeraddr = NULL) {
121119
return sendto(buf->data(), buf->size(), peeraddr);
@@ -152,7 +150,6 @@ class UdpClientEventLoopTmpl {
152150
std::function<void(const TSocketChannelPtr&, Buffer*)> onWriteComplete;
153151

154152
private:
155-
std::mutex sendto_mutex;
156153
EventLoopPtr loop_;
157154
};
158155

evpp/UdpServer.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,7 @@ class UdpServerEventLoopTmpl {
8989
// sendto thread-safe
9090
int sendto(const void* data, int size, struct sockaddr* peeraddr = NULL) {
9191
if (channel == NULL) return -1;
92-
std::lock_guard<std::mutex> locker(sendto_mutex);
93-
if (peeraddr) hio_set_peeraddr(channel->io(), peeraddr, SOCKADDR_LEN(peeraddr));
94-
return channel->write(data, size);
92+
return hio_sendto(channel->io(), data, size, peeraddr);
9593
}
9694
int sendto(Buffer* buf, struct sockaddr* peeraddr = NULL) {
9795
return sendto(buf->data(), buf->size(), peeraddr);
@@ -126,7 +124,6 @@ class UdpServerEventLoopTmpl {
126124
std::function<void(const TSocketChannelPtr&, Buffer*)> onWriteComplete;
127125

128126
private:
129-
std::mutex sendto_mutex;
130127
EventLoopPtr loop_;
131128
};
132129

examples/nmap/nmap.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,7 @@ int nmap_discover(Nmap* nmap) {
115115
memset(&peeraddr, 0, addrlen);
116116
peeraddr.sin_family = AF_INET;
117117
peeraddr.sin_addr.s_addr = iter->first;
118-
hio_set_peeraddr(io, (struct sockaddr*)&peeraddr, addrlen);
119-
hsendto(loop, hio_fd(io), sendbuf, sizeof(sendbuf), NULL);
118+
hio_sendto(io, sendbuf, sizeof(sendbuf), (struct sockaddr*)&peeraddr);
120119
++ctx.send_cnt;
121120
}
122121

0 commit comments

Comments
 (0)