Compare commits
1 Commits
3ba33575e6
...
d2d7c82ca4
Author | SHA1 | Date | |
---|---|---|---|
|
d2d7c82ca4 |
@ -1,60 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "SafeUDPpacket.h"
|
|
||||||
|
|
||||||
class SafeUDPpacketV
|
|
||||||
{
|
|
||||||
std::vector<SafeUDPpacket> m_packetV;
|
|
||||||
public:
|
|
||||||
SafeUDPpacketV (const void*, const int, const int mtu = 1450);
|
|
||||||
SafeUDPpacketV (int howmany, int size)
|
|
||||||
{
|
|
||||||
UDPpacket** p;
|
|
||||||
m_packetV.reserve (howmany);
|
|
||||||
if (NULL == (p = SDLNet_AllocPacketV (howmany, size)))
|
|
||||||
{
|
|
||||||
throw "SDLNet_AllocPacketV: " + std::string (SDLNet_GetError ());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (; (p != NULL) && (*p != NULL); p++)
|
|
||||||
{
|
|
||||||
m_packetV.push_back (SafeUDPpacket (*p));
|
|
||||||
}
|
|
||||||
SDL_assert ((m_packetV.size () > 0) && (howmany == (int)m_packetV.size ()));
|
|
||||||
/*
|
|
||||||
* SDLNet_FreePacketV just calls SDLNet_FreePacket on each packet.
|
|
||||||
* The "packetV" itself is just something allocated on the heap.
|
|
||||||
* We don't need this any longer.
|
|
||||||
*/
|
|
||||||
SDL_free (p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int Send (UDPsocket sock)
|
|
||||||
{
|
|
||||||
size_t size;
|
|
||||||
int numsent;
|
|
||||||
UDPpacket** pV;
|
|
||||||
size = m_packetV.size ();
|
|
||||||
if (NULL != (pV = (UDPpacket**)SDL_malloc (sizeof (UDPpacket*) * size)))
|
|
||||||
{
|
|
||||||
for (size_t i = 0; i < size; i++)
|
|
||||||
pV[i] = m_packetV[i].get ();
|
|
||||||
numsent = SDLNet_UDP_SendV (sock, pV, size);
|
|
||||||
SDL_free (pV);
|
|
||||||
}
|
|
||||||
return numsent;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t size (void) const { return m_packetV.size (); }
|
|
||||||
const SafeUDPpacket& get (size_t idx) { return m_packetV.at (idx); }
|
|
||||||
|
|
||||||
void channel (int channel) { for (auto& p : m_packetV) { p.channel (channel); } }
|
|
||||||
void len (int len) { for (auto& p : m_packetV) { p.len (len); } }
|
|
||||||
void maxlen (int maxlen) { for (auto& p : m_packetV) { p.maxlen (maxlen); } }
|
|
||||||
void status (int status) { for (auto& p : m_packetV) { p.status (status); } }
|
|
||||||
void address (IPaddress address) { for (auto& p : m_packetV) { p.address (address); } }
|
|
||||||
|
|
||||||
std::string toString (void);
|
|
||||||
};
|
|
||||||
|
|
@ -1,80 +0,0 @@
|
|||||||
#include "SafeUDPpacketV.h"
|
|
||||||
|
|
||||||
SafeUDPpacketV::SafeUDPpacketV (const void* buf, const int size, const int mtu)
|
|
||||||
{
|
|
||||||
int howmany, i, len, numsent;
|
|
||||||
const uint8_t* bufPtr;
|
|
||||||
const uint8_t* bufPtrEnd;
|
|
||||||
|
|
||||||
SDL_assert (NULL != buf);
|
|
||||||
|
|
||||||
SDL_assert (mtu > 0);
|
|
||||||
howmany = (int) ceil ((double) size / (double) mtu);
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
numsent = 0;
|
|
||||||
bufPtr = (const uint8_t*) buf;
|
|
||||||
bufPtrEnd = bufPtr + size;
|
|
||||||
while ((i < howmany) && (bufPtr < bufPtrEnd) && (numsent < size))
|
|
||||||
{
|
|
||||||
SafeUDPpacket p (mtu);
|
|
||||||
|
|
||||||
len = size - numsent;
|
|
||||||
if (len > mtu)
|
|
||||||
len = mtu;
|
|
||||||
/* Use SDLNet_UDP_Send to send an empty packet instead... it's probably simpler than all this machinery. */
|
|
||||||
if (len < 1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Clear the entire data ... TODO */
|
|
||||||
p.len (mtu);
|
|
||||||
p.clear ();
|
|
||||||
|
|
||||||
/* Set the actual length */
|
|
||||||
p.len (len);
|
|
||||||
p.maxlen (size);
|
|
||||||
|
|
||||||
/* only memcpy in the relevant bits */
|
|
||||||
p.slurp (bufPtr, len);
|
|
||||||
|
|
||||||
m_packetV.push_back (std::move (p));
|
|
||||||
|
|
||||||
/* Advance */
|
|
||||||
bufPtr += len;
|
|
||||||
numsent += len;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_assert (howmany == (int)m_packetV.size ());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
std::string
|
|
||||||
SafeUDPpacketV::toString (void)
|
|
||||||
{
|
|
||||||
int howmany, maxlen, mtu, numrecv;
|
|
||||||
char* bufPtr;
|
|
||||||
char* bufPtrEnd;
|
|
||||||
std::string buf;
|
|
||||||
|
|
||||||
howmany = m_packetV.size ();
|
|
||||||
SDL_assert (howmany > 0);
|
|
||||||
|
|
||||||
maxlen = m_packetV[0].maxlen ();
|
|
||||||
SDL_assert (maxlen > 0);
|
|
||||||
buf.reserve (maxlen);
|
|
||||||
bufPtr = &buf[0];
|
|
||||||
bufPtrEnd = bufPtr + maxlen;
|
|
||||||
|
|
||||||
for (numrecv = 0; (numrecv < howmany) && (bufPtr < bufPtrEnd); numrecv++)
|
|
||||||
{
|
|
||||||
mtu = m_packetV[numrecv].len ();
|
|
||||||
SDL_assert (mtu > 0);
|
|
||||||
memcpy (bufPtr, m_packetV[numrecv].data (), mtu);
|
|
||||||
bufPtr += mtu;
|
|
||||||
}
|
|
||||||
|
|
||||||
SDL_assert (numrecv == howmany);
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user