Create send_vecio() function

This is a generic way of sending multiple packets with one system call.

It takes a pointer to vecio_buf (mmsghdr on Linux, TRANSMIT_PACKETS_ELEMENT
on Windows) and vecio_buf length and calls either sendmmsg(2) or TransmitPackets()
This commit is contained in:
Aaro Altonen 2019-10-02 11:41:06 +03:00
parent 9d6f58db59
commit d9065aa564
2 changed files with 28 additions and 1 deletions

View File

@ -277,6 +277,23 @@ rtp_error_t kvz_rtp::socket::sendto(
return __sendtov(addr, buffers, flags, bytes_sent);
}
rtp_error_t kvz_rtp::socket::send_vecio(vecio_buf *buffers, size_t nbuffers, int flags)
{
if (buffers == nullptr || nbuffers == 0)
return RTP_INVALID_VALUE;
#ifdef __linux__
if (sendmmsg(socket_, buffers, nbuffers, flags) < 0) {
LOG_ERROR("Failed to flush the message queue: %s", strerror(errno));
return RTP_SEND_ERROR;
}
return RTP_OK;
#else
/* TODO: */
#endif
}
rtp_error_t kvz_rtp::socket::__recvfrom(uint8_t *buf, size_t buf_len, int flags, sockaddr_in *sender, int *bytes_read)
{
socklen_t *len_ptr = nullptr;

View File

@ -19,8 +19,10 @@ namespace kvz_rtp {
#ifdef _WIN32
typedef SOCKET socket_t;
typedef unsigned socklen_t;
typedef TRANSMIT_PACKETS_ELEMENT vecio_buf;
#else
typedef int socket_t;
typedef mmsghdr vecio_buf;
#endif
const int MAX_BUFFER_COUNT = 256;
@ -71,6 +73,14 @@ namespace kvz_rtp {
rtp_error_t sendto(sockaddr_in& addr, std::vector<std::pair<size_t, uint8_t *>> buffers, int flags);
rtp_error_t sendto(sockaddr_in& addr, std::vector<std::pair<size_t, uint8_t *>> buffers, int flags, int *bytes_sent);
/* Special sendto() functions, used to send multiple UDP packets with one system call
* Internally it uses sendmmsg(2) (Linux) or TransmitPackets (Windows)
*
* Return RTP_OK on success
* Return RTP_INVALID_VALUE if one of the parameters is invalid
* Return RTP_SEND_ERROR if sendmmsg/TransmitPackets failed */
rtp_error_t send_vecio(vecio_buf *buffers, size_t nbuffers, int flags);
/* Same as recvfrom(2), receives a message from remote
*
* Write the sender address to "sender" if it's not NULL