Screenary.TransportClient.SendPDU C# (CSharp) Method

SendPDU() public method

public SendPDU ( byte buffer, UInt16 channelId, byte pduType ) : void
buffer byte
channelId System.UInt16
pduType byte
return void
        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;
        }

Usage Example

Ejemplo n.º 1
0
 public override void Send(byte[] buffer, byte pduType)
 {
     transport.SendPDU(buffer, PDU_CHANNEL_INPUT, pduType);
 }