public void SendPDU(byte[] buffer, UInt16 channelId, byte pduType)
{
Socket socket;
BinaryWriter s;
int offset = 0;
UInt16 fragSize;
int totalSize = 0;
socket = tcpClient.Client;
totalSize = (int) buffer.Length;
byte[] fragment = new byte[PDU_MAX_FRAG_SIZE];
if (totalSize <= PDU_MAX_PAYLOAD_SIZE)
{
/* Single fragment */
fragSize = (UInt16) totalSize;
s = new BinaryWriter(new MemoryStream(fragment));
s.Write(channelId);
s.Write(pduType);
s.Write(PDU_FRAGMENT_SINGLE);
s.Write((UInt16) (fragSize + PDU_HEADER_SIZE));
s.Write(buffer, 0, fragSize);
SendAll(socket, fragment, 0, fragSize + PDU_HEADER_SIZE);
offset += fragSize;
return;
}
else
{
/* First fragment of a series of fragments */
fragSize = (UInt16) PDU_MAX_PAYLOAD_SIZE;
s = new BinaryWriter(new MemoryStream(fragment));
s.Write(channelId);
s.Write(pduType);
s.Write(PDU_FRAGMENT_FIRST);
s.Write((UInt16) (fragSize + PDU_HEADER_SIZE));
s.Write(buffer, 0, fragSize);
SendAll(socket, fragment, 0, fragSize + PDU_HEADER_SIZE);
offset += fragSize;
while (offset < totalSize)
{
if ((totalSize - offset) <= PDU_MAX_PAYLOAD_SIZE)
{
/* Last fragment of a series of fragments */
fragSize = (UInt16) (totalSize - offset);
s = new BinaryWriter(new MemoryStream(fragment));
s.Write(channelId);
s.Write(pduType);
s.Write(PDU_FRAGMENT_LAST);
s.Write((UInt16) (fragSize + PDU_HEADER_SIZE));
s.Write(buffer, offset, fragSize);
SendAll(socket, fragment, 0, fragSize + PDU_HEADER_SIZE);
offset += fragSize;
return;
}
else
{
/* "in between" fragment of a series of fragments */
fragSize = PDU_MAX_PAYLOAD_SIZE;
s = new BinaryWriter(new MemoryStream(fragment));
s.Write(channelId);
s.Write(pduType);
s.Write(PDU_FRAGMENT_NEXT);
s.Write((UInt16) (fragSize + PDU_HEADER_SIZE));
s.Write(buffer, offset, fragSize);
SendAll(socket, fragment, 0, fragSize + PDU_HEADER_SIZE);
offset += fragSize;
}
}
}
return;
}