added support for MSG_PEEK

This commit is contained in:
Erik Frojdh 2020-03-24 09:20:38 +01:00
parent 9753d075f0
commit 8fc1578a5e
2 changed files with 33 additions and 12 deletions

View File

@ -74,15 +74,6 @@ class UdpRxSocket {
buff = new char[packet_size];
}
// // Delegating constructor to allow drop in replacement for old socket class
// // This one might be removed in the future
// UdpRxSocket(unsigned short int const port_number,
// genericSocket::communicationProtocol p,
// int ps = DEFAULT_PACKET_SIZE, const char *eth = NULL,
// int hsize = 0, uint64_t buf_size = SOCKET_BUFFER_SIZE)
// : UdpRxSocket(port_number, ps, InterfaceNameToIp(eth).str().c_str(),
// buf_size) {}
~UdpRxSocket() {
delete[] buff;
Shutdown();
@ -93,12 +84,16 @@ class UdpRxSocket {
bool ReceivePacket() noexcept { return ReceivePacket(buff); }
bool ReceivePacket(char *dst) noexcept {
bool ReceivePacket(char *dst, int flags = 0) noexcept {
auto bytes_received =
recvfrom(fd, dst, packet_size, 0, nullptr, nullptr);
recvfrom(fd, dst, packet_size, flags, nullptr, nullptr);
return bytes_received == packet_size;
}
bool PeekPacket() noexcept{
return ReceivePacket(buff, MSG_PEEK);
}
// Only for backwards compatibility this function will be removed during
// refactoring of the receiver
ssize_t ReceiveDataOnly(char *dst) {

View File

@ -106,4 +106,30 @@ TEST_CASE("Receive an int to an external buffer"){
write(fd, &to_send, sizeof(to_send));
CHECK(s.ReceivePacket(reinterpret_cast<char*>(&received)));
CHECK(received == to_send);
}
}
TEST_CASE("PEEK data"){
int to_send = 5;
int to_send2 = 12;
int received = -1;
auto fd = open_socket(default_port);
sls::UdpRxSocket s(default_port, sizeof(int));
write(fd, &to_send, sizeof(to_send));
write(fd, &to_send2, sizeof(to_send));
CHECK(s.PeekPacket());
memcpy(&received, s.LastPacket(), sizeof(int));
CHECK(received == to_send);
CHECK(s.PeekPacket());
memcpy(&received, s.LastPacket(), sizeof(int));
CHECK(received == to_send);
CHECK(s.ReceivePacket());
memcpy(&received, s.LastPacket(), sizeof(int));
CHECK(received == to_send);
CHECK(s.ReceivePacket());
memcpy(&received, s.LastPacket(), sizeof(int));
CHECK(received == to_send2);
}