zeek/auxil/libunistd/portable/ipc/BsdSocketPool.h
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

69 lines
1.3 KiB
C++

// portable/BsdSocketPool.h
// Created by Robin Rowe on 11/27/2015
// Copyright (c) 2015 Robin.Rowe@CinePaint.org
// License open source MIT
#ifndef BsdSocketPool_h
#define BsdSocketPool_h
#include "PacketSocket.h"
#include "PacketWriter.h"
#include "PacketStats.h"
namespace portable
{
class BsdSocketPool
{ bool isStreaming;
std::vector<SOCKET> socketfd;
AtomicCounter<unsigned> counter;
void ReleaseSlots();
bool IsGood(SOCKET sid) const
{ if(!sid || -1==sid)
{ return false;
}
return true;
}
public:
PacketStats stats;
void Close()
{ ReleaseSlots();
}
void Reset(unsigned size)
{ socketfd.resize(size);
socketfd.assign(size,0);
counter=0;
stats.Reset();
}
unsigned GetCount() const
{ return counter;
}
bool IsEmpty() const
{ return 0==counter;
}
bool IsStreaming() const
{ return isStreaming;
}
void SetIsStreaming(bool isStreaming)
{ this->isStreaming = isStreaming;
}
bool SendPacket(Packet* packet,unsigned i)
{ PacketSocket bsdSocket(socketfd[i]);
if(bsdSocket.SendTo(*packet))
{ stats.Transmit(packet->GetPacketId());
return true;
}
ReleaseSlot(i);
return false;
}
bool SetSlot(SOCKET sid);
bool SetZombieSlot(SOCKET sid);
bool ReleaseSlot(SOCKET* sock);
void ReleaseSlot(SOCKET slot);
int DirectMulticast(Packet* framePacket);
};
}
#endif