public int recvfrom(int id, ref CPacket packet)
{
packet = null;
CGuard bufferlock = new CGuard(m_PassLock);
// Try to find a packet for the specified
// socket ID
CPacket workPacket;
if (!m_mBuffer.TryGetValue(id, out workPacket))
{
// If we didn't find the packet waiting already
// Then wait around until a packet arrives
m_PassLock.ReleaseMutex();
m_PassCond.WaitOne(1000);
m_PassLock.WaitOne(-1);
// Try to find it again
if (!m_Buffer.TryGetValue(id, out workPacket))
{
packet.setLength(-1);
return -1;
}
}
if (packet.getLength() < i.second.getLength())
{
packet.setLength(-1);
return -1;
}
workPacket.m_nHeader.CopyTo(packet.m_nHeader, 0);
workPacket.m_pcData.CopyTo(packet.m_pcData, 0);
packet.setLength(workPacket.getLength());
m_mBuffer.Remove(i);
return packet.getLength();
}