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.EndRecei ve(). 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 ReceivedPacketC allBack(Packet pack);
class PacketReceiver
{
private ReceivedPacketC allBack m_newPacket;
private IOBuffer m_socketAndBuff er;
private int m_blockSize;
private uint m_packetSize;
private uint m_receivedBytes ;
private List<bytem_hold Buffer;
public PacketReceiver( IOBuffer theSockBuff, int blockSize)
{
m_socketAndBuff er = theSockBuff;
m_blockSize = blockSize;
m_socketAndBuff er.ClearBuffer( );
m_packetSize = 0;
m_receivedBytes = 0;
//m_holdBuffer = new List<byte>();
}
public void NeedPacket(Rece ivedPacketCallB ack pack)
{
m_newPacket = pack;
}
//should make sure that we receive one and only one packet
public void ReceivePacket()
{
m_socketAndBuff er.ClearBuffer( );
if (m_socketAndBuf fer.IsConnected )
{
AsyncCallback callMe = new
AsyncCallback(R eceiveCallBack) ;
m_socketAndBuff er.ResizeByteBu ffer((uint)m_bl ockSize);
Console.WriteLi ne("The Buffer is " +
m_socketAndBuff er.m_buffer.Cou nt + " big in bytes.");
m_socketAndBuff er.m_sockMe.Beg inReceive(m_soc ketAndBuffer.m_ buffer,
SocketFlags.Non e, callMe, m_socketAndBuff er);
}
else
{
throw new Exception("The socket is no longer
connected.");
}
}
private void ReceiveCallBack (IAsyncResult ar)
{
m_socketAndBuff er = (IOBuffer)ar.As yncState;
if (m_socketAndBuf fer.IsConnected )
{
m_receivedBytes =
(uint)m_socketA ndBuffer.m_sock Me.EndReceive(a r);
m_holdBuffer = new List<byte>((int )m_receivedByte s);
m_holdBuffer.Ad dRange(m_socket AndBuffer.m_buf fer[0].Array);
m_socketAndBuff er.ClearBuffer( );
m_packetSize = Packet.ReadInt3 2FromBytes(m_ho ldBuffer,
0);
Console.WriteLi ne("The packet size is " + m_packetSize
+ "");
UInt32 bytesLeft = m_packetSize - (uint)(m_blockS ize -
4);
Console.WriteLi ne("We need to read " + bytesLeft + "
more bytes.");
if (bytesLeft 512000000)
{
Console.WriteLi ne("size to big");
}
m_socketAndBuff er.ResizeByteBu ffer(bytesLeft) ;
AsyncCallback callme = new
AsyncCallback(C reatePacket);
m_socketAndBuff er.m_sockMe.Beg inReceive(m_soc ketAndBuffer.m_ buffer,
SocketFlags.Non e, callme, m_socketAndBuff er);
}
}
private void CreatePacket(IA syncResult ar)
{
m_socketAndBuff er = (IOBuffer)ar.As yncState;
if (m_socketAndBuf fer.IsConnected )
{
m_receivedBytes +=
(uint)m_socketA ndBuffer.m_sock Me.EndReceive(a r);
m_holdBuffer.Ad dRange(m_socket AndBuffer.m_buf fer[0].Array);
if (m_receivedByte s < (m_packetSize + 4))
{
uint leftOver = m_receivedBytes - m_packetSize +
4;
m_socketAndBuff er.ResizeByteBu ffer(leftOver);
AsyncCallback callMeNow = new
AsyncCallback(C reatePacket);
m_socketAndBuff er.m_sockMe.Beg inReceive(m_soc ketAndBuffer.m_ buffer,
SocketFlags.Non e, callMeNow, m_socketAndBuff er);
}
Packet thePacket = Packet.ParseByt es(m_holdBuffer ,
m_blockSize);
m_newPacket(the Packet); //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.EndRecei ve(). 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 ReceivedPacketC allBack(Packet pack);
class PacketReceiver
{
private ReceivedPacketC allBack m_newPacket;
private IOBuffer m_socketAndBuff er;
private int m_blockSize;
private uint m_packetSize;
private uint m_receivedBytes ;
private List<bytem_hold Buffer;
public PacketReceiver( IOBuffer theSockBuff, int blockSize)
{
m_socketAndBuff er = theSockBuff;
m_blockSize = blockSize;
m_socketAndBuff er.ClearBuffer( );
m_packetSize = 0;
m_receivedBytes = 0;
//m_holdBuffer = new List<byte>();
}
public void NeedPacket(Rece ivedPacketCallB ack pack)
{
m_newPacket = pack;
}
//should make sure that we receive one and only one packet
public void ReceivePacket()
{
m_socketAndBuff er.ClearBuffer( );
if (m_socketAndBuf fer.IsConnected )
{
AsyncCallback callMe = new
AsyncCallback(R eceiveCallBack) ;
m_socketAndBuff er.ResizeByteBu ffer((uint)m_bl ockSize);
Console.WriteLi ne("The Buffer is " +
m_socketAndBuff er.m_buffer.Cou nt + " big in bytes.");
m_socketAndBuff er.m_sockMe.Beg inReceive(m_soc ketAndBuffer.m_ buffer,
SocketFlags.Non e, callMe, m_socketAndBuff er);
}
else
{
throw new Exception("The socket is no longer
connected.");
}
}
private void ReceiveCallBack (IAsyncResult ar)
{
m_socketAndBuff er = (IOBuffer)ar.As yncState;
if (m_socketAndBuf fer.IsConnected )
{
m_receivedBytes =
(uint)m_socketA ndBuffer.m_sock Me.EndReceive(a r);
m_holdBuffer = new List<byte>((int )m_receivedByte s);
m_holdBuffer.Ad dRange(m_socket AndBuffer.m_buf fer[0].Array);
m_socketAndBuff er.ClearBuffer( );
m_packetSize = Packet.ReadInt3 2FromBytes(m_ho ldBuffer,
0);
Console.WriteLi ne("The packet size is " + m_packetSize
+ "");
UInt32 bytesLeft = m_packetSize - (uint)(m_blockS ize -
4);
Console.WriteLi ne("We need to read " + bytesLeft + "
more bytes.");
if (bytesLeft 512000000)
{
Console.WriteLi ne("size to big");
}
m_socketAndBuff er.ResizeByteBu ffer(bytesLeft) ;
AsyncCallback callme = new
AsyncCallback(C reatePacket);
m_socketAndBuff er.m_sockMe.Beg inReceive(m_soc ketAndBuffer.m_ buffer,
SocketFlags.Non e, callme, m_socketAndBuff er);
}
}
private void CreatePacket(IA syncResult ar)
{
m_socketAndBuff er = (IOBuffer)ar.As yncState;
if (m_socketAndBuf fer.IsConnected )
{
m_receivedBytes +=
(uint)m_socketA ndBuffer.m_sock Me.EndReceive(a r);
m_holdBuffer.Ad dRange(m_socket AndBuffer.m_buf fer[0].Array);
if (m_receivedByte s < (m_packetSize + 4))
{
uint leftOver = m_receivedBytes - m_packetSize +
4;
m_socketAndBuff er.ResizeByteBu ffer(leftOver);
AsyncCallback callMeNow = new
AsyncCallback(C reatePacket);
m_socketAndBuff er.m_sockMe.Beg inReceive(m_soc ketAndBuffer.m_ buffer,
SocketFlags.Non e, callMeNow, m_socketAndBuff er);
}
Packet thePacket = Packet.ParseByt es(m_holdBuffer ,
m_blockSize);
m_newPacket(the Packet); //send the packet to
whoever needs it (delegate)
}
}
}
Comment