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:
parent
9d6f58db59
commit
d9065aa564
|
|
@ -277,6 +277,23 @@ rtp_error_t kvz_rtp::socket::sendto(
|
||||||
return __sendtov(addr, buffers, flags, bytes_sent);
|
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)
|
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;
|
socklen_t *len_ptr = nullptr;
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,10 @@ namespace kvz_rtp {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
typedef SOCKET socket_t;
|
typedef SOCKET socket_t;
|
||||||
typedef unsigned socklen_t;
|
typedef unsigned socklen_t;
|
||||||
|
typedef TRANSMIT_PACKETS_ELEMENT vecio_buf;
|
||||||
#else
|
#else
|
||||||
typedef int socket_t;
|
typedef int socket_t;
|
||||||
|
typedef mmsghdr vecio_buf;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const int MAX_BUFFER_COUNT = 256;
|
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);
|
||||||
rtp_error_t sendto(sockaddr_in& addr, std::vector<std::pair<size_t, uint8_t *>> buffers, int flags, int *bytes_sent);
|
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
|
/* Same as recvfrom(2), receives a message from remote
|
||||||
*
|
*
|
||||||
* Write the sender address to "sender" if it's not NULL
|
* Write the sender address to "sender" if it's not NULL
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue