D
darthghandi
I am having mixed results with asynchronous socket receives.
Sometimes I get the right information back from the buffer, other
times I get some of the data that should be in the buffer printed out
to the console. That data is printed out to the console before I even
call Socket.EndReceive(). After that call, I get the rest of the data
that wasn't printed out to the console in the buffer. Anyone have
any idea what is going on?
Here's the code:
public delegate void ReceivedPacketCallBack(Packet pack);
class PacketReceiver
{
private ReceivedPacketCallBack m_newPacket;
private IOBuffer m_socketAndBuffer;
private int m_blockSize;
private uint m_packetSize;
private uint m_receivedBytes;
private List<byte> m_holdBuffer;
public PacketReceiver(IOBuffer theSockBuff, int blockSize)
{
m_socketAndBuffer = theSockBuff;
m_blockSize = blockSize;
m_socketAndBuffer.ClearBuffer();
m_packetSize = 0;
m_receivedBytes = 0;
//m_holdBuffer = new List<byte>();
}
public void NeedPacket(ReceivedPacketCallBack pack)
{
m_newPacket = pack;
}
//should make sure that we receive one and only one packet
public void ReceivePacket()
{
m_socketAndBuffer.ClearBuffer();
if (m_socketAndBuffer.IsConnected)
{
AsyncCallback callMe = new
AsyncCallback(ReceiveCallBack);
m_socketAndBuffer.ResizeByteBuffer((uint)m_blockSize);
Console.WriteLine("The Buffer is " +
m_socketAndBuffer.m_buffer.Count + " big in bytes.");
m_socketAndBuffer.m_sockMe.BeginReceive(m_socketAndBuffer.m_buffer,
SocketFlags.None, callMe, m_socketAndBuffer);
}
else
{
throw new Exception("The socket is no longer
connected.");
}
}
private void ReceiveCallBack(IAsyncResult ar)
{
m_socketAndBuffer = (IOBuffer)ar.AsyncState;
if (m_socketAndBuffer.IsConnected)
{
m_receivedBytes =
(uint)m_socketAndBuffer.m_sockMe.EndReceive(ar);
m_holdBuffer = new List<byte>((int)m_receivedBytes);
m_holdBuffer.AddRange(m_socketAndBuffer.m_buffer[0].Array);
m_socketAndBuffer.ClearBuffer();
m_packetSize = Packet.ReadInt32FromBytes(m_holdBuffer,
0);
Console.WriteLine("The packet size is " + m_packetSize
+ "");
UInt32 bytesLeft = m_packetSize - (uint)(m_blockSize -
4);
Console.WriteLine("We need to read " + bytesLeft + "
more bytes.");
if (bytesLeft > 512000000)
{
Console.WriteLine("size to big");
}
m_socketAndBuffer.ResizeByteBuffer(bytesLeft);
AsyncCallback callme = new
AsyncCallback(CreatePacket);
m_socketAndBuffer.m_sockMe.BeginReceive(m_socketAndBuffer.m_buffer,
SocketFlags.None, callme, m_socketAndBuffer);
}
}
private void CreatePacket(IAsyncResult ar)
{
m_socketAndBuffer = (IOBuffer)ar.AsyncState;
if (m_socketAndBuffer.IsConnected)
{
m_receivedBytes +=
(uint)m_socketAndBuffer.m_sockMe.EndReceive(ar);
m_holdBuffer.AddRange(m_socketAndBuffer.m_buffer[0].Array);
if (m_receivedBytes < (m_packetSize + 4))
{
uint leftOver = m_receivedBytes - m_packetSize +
4;
m_socketAndBuffer.ResizeByteBuffer(leftOver);
AsyncCallback callMeNow = new
AsyncCallback(CreatePacket);
m_socketAndBuffer.m_sockMe.BeginReceive(m_socketAndBuffer.m_buffer,
SocketFlags.None, callMeNow, m_socketAndBuffer);
}
Packet thePacket = Packet.ParseBytes(m_holdBuffer,
m_blockSize);
m_newPacket(thePacket); //send the packet to
whoever needs it (delegate)
}
}
}
Sometimes I get the right information back from the buffer, other
times I get some of the data that should be in the buffer printed out
to the console. That data is printed out to the console before I even
call Socket.EndReceive(). After that call, I get the rest of the data
that wasn't printed out to the console in the buffer. Anyone have
any idea what is going on?
Here's the code:
public delegate void ReceivedPacketCallBack(Packet pack);
class PacketReceiver
{
private ReceivedPacketCallBack m_newPacket;
private IOBuffer m_socketAndBuffer;
private int m_blockSize;
private uint m_packetSize;
private uint m_receivedBytes;
private List<byte> m_holdBuffer;
public PacketReceiver(IOBuffer theSockBuff, int blockSize)
{
m_socketAndBuffer = theSockBuff;
m_blockSize = blockSize;
m_socketAndBuffer.ClearBuffer();
m_packetSize = 0;
m_receivedBytes = 0;
//m_holdBuffer = new List<byte>();
}
public void NeedPacket(ReceivedPacketCallBack pack)
{
m_newPacket = pack;
}
//should make sure that we receive one and only one packet
public void ReceivePacket()
{
m_socketAndBuffer.ClearBuffer();
if (m_socketAndBuffer.IsConnected)
{
AsyncCallback callMe = new
AsyncCallback(ReceiveCallBack);
m_socketAndBuffer.ResizeByteBuffer((uint)m_blockSize);
Console.WriteLine("The Buffer is " +
m_socketAndBuffer.m_buffer.Count + " big in bytes.");
m_socketAndBuffer.m_sockMe.BeginReceive(m_socketAndBuffer.m_buffer,
SocketFlags.None, callMe, m_socketAndBuffer);
}
else
{
throw new Exception("The socket is no longer
connected.");
}
}
private void ReceiveCallBack(IAsyncResult ar)
{
m_socketAndBuffer = (IOBuffer)ar.AsyncState;
if (m_socketAndBuffer.IsConnected)
{
m_receivedBytes =
(uint)m_socketAndBuffer.m_sockMe.EndReceive(ar);
m_holdBuffer = new List<byte>((int)m_receivedBytes);
m_holdBuffer.AddRange(m_socketAndBuffer.m_buffer[0].Array);
m_socketAndBuffer.ClearBuffer();
m_packetSize = Packet.ReadInt32FromBytes(m_holdBuffer,
0);
Console.WriteLine("The packet size is " + m_packetSize
+ "");
UInt32 bytesLeft = m_packetSize - (uint)(m_blockSize -
4);
Console.WriteLine("We need to read " + bytesLeft + "
more bytes.");
if (bytesLeft > 512000000)
{
Console.WriteLine("size to big");
}
m_socketAndBuffer.ResizeByteBuffer(bytesLeft);
AsyncCallback callme = new
AsyncCallback(CreatePacket);
m_socketAndBuffer.m_sockMe.BeginReceive(m_socketAndBuffer.m_buffer,
SocketFlags.None, callme, m_socketAndBuffer);
}
}
private void CreatePacket(IAsyncResult ar)
{
m_socketAndBuffer = (IOBuffer)ar.AsyncState;
if (m_socketAndBuffer.IsConnected)
{
m_receivedBytes +=
(uint)m_socketAndBuffer.m_sockMe.EndReceive(ar);
m_holdBuffer.AddRange(m_socketAndBuffer.m_buffer[0].Array);
if (m_receivedBytes < (m_packetSize + 4))
{
uint leftOver = m_receivedBytes - m_packetSize +
4;
m_socketAndBuffer.ResizeByteBuffer(leftOver);
AsyncCallback callMeNow = new
AsyncCallback(CreatePacket);
m_socketAndBuffer.m_sockMe.BeginReceive(m_socketAndBuffer.m_buffer,
SocketFlags.None, callMeNow, m_socketAndBuffer);
}
Packet thePacket = Packet.ParseBytes(m_holdBuffer,
m_blockSize);
m_newPacket(thePacket); //send the packet to
whoever needs it (delegate)
}
}
}