void Udp::OnSend(/* [in] */ uv_udp_send_t *req, /* [in] */ int status) { Udp *self = (Udp *) req->data; Buffer *sendBuffer = self->m_pSendBuffer; self->m_pSendBuffer = NULL; if(self->m_pSendHandler) { SendHandler *sendHandler = self->m_pSendHandler; self->m_pSendHandler = NULL; sendHandler->OnSend(self, status); } sendBuffer->Unlock(); sendBuffer->Unref(); if(status) { self->Close(); } self->Unref(); }
void Udp::OnRecv(/* [in] */ uv_udp_t *peer, /* [in] */ ssize_t nread, /* [in] */ const uv_buf_t *buf, /* [in] */ const sockaddr *addr, /* [in] */ unsigned flags) { if(! nread) { Buffer::Free(buf->base); return; } Udp *self = (Udp *) peer->data; Buffer *buffer = NULL; if(0 < nread) { buffer = new Buffer(buf, nread); } Address address; if(addr) { address.Set(addr); } self->m_pRecvHandler->OnRecv(self, buffer, address, flags, 0 > nread ? nread : 0); if(buffer) { buffer->Unref(); } if(0 > nread) { self->Close(); } }