diff --git a/src/sockfun.cpp b/src/sockfun.cpp index 400cde8b70e3f2cdc88d653a82f05bfa081298f4..7115657d254faa4f2790711c541f93cf4c9e6410 100644 --- a/src/sockfun.cpp +++ b/src/sockfun.cpp @@ -25,34 +25,45 @@ bool validate_host_address(uint32_t host_addr); bool recv_data(SOCKET s, char *buf, size_t nbytes, bool accept_incomplete_packet, size_t *packet_size) { - ssize_t nret, nrecv = 0; + ssize_t nret, nrecv = 0; if (!buf || !nbytes) { return false; } do { - nret = recv(s, &buf[nrecv], ssize_t(nbytes)-nrecv, 0); + nret = recv(s, &buf[nrecv], ssize_t(nbytes)-nrecv, 0); if (nret > 0) { nrecv += nret; } - } while(nret != SOCKET_ERROR && !accept_incomplete_packet && (nrecv < int(nbytes))); + } while(nret != SOCKET_ERROR && !accept_incomplete_packet && (nrecv < int(nbytes))); if (accept_incomplete_packet) { if (packet_size) *packet_size = nrecv; return (nrecv > 0); } else { - return (nrecv == int(nbytes)); + return (nrecv == int(nbytes)); } } bool send_data(SOCKET s, const char *buf, size_t nbytes) { - ssize_t nret; + ssize_t nret; if (!buf || !nbytes) { return false; } - nret = send(s, buf, ssize_t(nbytes), 0); - return (nret == ssize_t(nbytes)); + nret = send(s, buf, ssize_t(nbytes), 0); + return (nret == ssize_t(nbytes)); +} + +bool udp_send_datagram(SOCKET s, char *buf, int length, sockaddr_in *send_addr) +{ + int nret; + int tolen = sizeof(sockaddr_in); + if (!buf || !length) { + return false; + } + nret = sendto(s, buf, length, 0, reinterpret_cast(send_addr), tolen); + return (nret == length); } bool udp_recv_datagram(SOCKET s, char *buf, size_t max_length, size_t *datagram_size, sockaddr_in *from_addr) @@ -64,7 +75,7 @@ bool udp_recv_datagram(SOCKET s, char *buf, size_t max_length, size_t *datagram_ if (s == INVALID_SOCKET) { return false; } - nret = recvfrom(s, buf, ssize_t(max_length), 0, reinterpret_cast(&from_addr_l), &from_size); + nret = recvfrom(s, buf, ssize_t(max_length), 0, reinterpret_cast(&from_addr_l), &from_size); if (nret > 0) { if (from_addr) {