コード例 #1
0
ファイル: icSocket.cs プロジェクト: jiagithub/PSS
        //合并分段
        private void MergeSegment(byte[] buff, UInt32 buffindex, UInt32 PacketLength)
        {
            const UInt16 CommnadSize = 2;     //命令大小
            const UInt16 ConnectSize = 12;     //连接大小
            const UInt16 DataidSize = 4;      //数据块编号大小
            const UInt16 DataLengthSize = 4;  //数据块长度大小
            const UInt16 DataOffsetSize = 4;  //数据块偏移大小
            const UInt16 PacketHead = CommnadSize + ConnectSize + DataidSize + DataLengthSize + DataOffsetSize;
            UInt32 segmentlength;
            int command = buff[buffindex] + (buff[buffindex + 1] << 8);
            if (command != (int)COMMAND_ID.COMMAND_PACKET)
            {
                ParseData(buff, buffindex, PacketLength);
            }
            else
            {
                UInt32 datalength = BitConverter.ToUInt32(buff, (int) buffindex + CommnadSize + ConnectSize + DataidSize); //总数据块大小
                if (PacketLength == datalength + PacketHead)   //未分段
                    ParseData(buff, buffindex, PacketLength);
                else
                {
                    UInt16 sourserverid = BitConverter.ToUInt16(buff, (int)buffindex + CommnadSize);
                    UInt16 sourappid = BitConverter.ToUInt16(buff, (int)buffindex + CommnadSize + 4);
                    UInt32 dataid = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + 12);
                    PacketKey key = new PacketKey() { serverid = sourserverid, appid = sourappid, dataid = dataid };

                    UInt32 offset = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + ConnectSize + DataidSize + DataLengthSize);
                    if(!bigsegmentbuff.ContainsKey(key))
                    {
                        byte[] b = new byte[datalength + PacketHead + 4]; // 前4字节为已接受多少数据
                        bigsegmentbuff.Add(key, b);
                        Array.Copy(buff, buffindex, bigsegmentbuff[key], 4, PacketLength);
                        bigsegmentbuff[key][0] = (byte)(PacketLength);
                        bigsegmentbuff[key][1] = (byte)(PacketLength >> 8);
                        bigsegmentbuff[key][2] = (byte)(PacketLength >> 16);
                        bigsegmentbuff[key][3] = (byte)(PacketLength >> 24);
                    }
                    else
                    {
                        segmentlength = BitConverter.ToUInt32(bigsegmentbuff[key], 0);
                        Array.Copy(buff, buffindex + PacketHead, bigsegmentbuff[key], offset + PacketHead + 4, PacketLength - PacketHead);
                        segmentlength = segmentlength + PacketLength - PacketHead;
                        bigsegmentbuff[key][0] = (byte)(segmentlength);
                        bigsegmentbuff[key][1] = (byte)(segmentlength >> 8);
                        bigsegmentbuff[key][2] = (byte)(segmentlength >> 16);
                        bigsegmentbuff[key][3] = (byte)(segmentlength >> 24);
                    }
                    segmentlength = BitConverter.ToUInt32(bigsegmentbuff[key], 0);
                    if (segmentlength == bigsegmentbuff[key].Length - 4) //最后一个段
                    {
                        ParseData(bigsegmentbuff[key], 4, segmentlength);
                        bigsegmentbuff.Remove(key);
                    }
                }
            }
        }
コード例 #2
0
        //合并分段
        private void MergeSegment(byte[] buff, UInt32 buffindex, UInt32 PacketLength)
        {
            const UInt16 CommnadSize    = 2;  //命令大小
            const UInt16 ConnectSize    = 12; //连接大小
            const UInt16 DataidSize     = 4;  //数据块编号大小
            const UInt16 DataLengthSize = 4;  //数据块长度大小
            const UInt16 DataOffsetSize = 4;  //数据块偏移大小
            const UInt16 PacketHead     = CommnadSize + ConnectSize + DataidSize + DataLengthSize + DataOffsetSize;
            UInt32       segmentlength;
            int          command = buff[buffindex] + (buff[buffindex + 1] << 8);

            if (command != (int)COMMAND_ID.COMMAND_PACKET)
            {
                ParseData(buff, buffindex, PacketLength);
            }
            else
            {
                UInt32 datalength = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + ConnectSize + DataidSize); //总数据块大小
                if (PacketLength == datalength + PacketHead)                                                              //未分段
                {
                    ParseData(buff, buffindex, PacketLength);
                }
                else
                {
                    UInt16    sourserverid = BitConverter.ToUInt16(buff, (int)buffindex + CommnadSize);
                    UInt16    sourappid    = BitConverter.ToUInt16(buff, (int)buffindex + CommnadSize + 4);
                    UInt32    dataid       = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + 12);
                    PacketKey key          = new PacketKey()
                    {
                        serverid = sourserverid, appid = sourappid, dataid = dataid
                    };

                    UInt32 offset = BitConverter.ToUInt32(buff, (int)buffindex + CommnadSize + ConnectSize + DataidSize + DataLengthSize);
                    if (!bigsegmentbuff.ContainsKey(key))
                    {
                        byte[] b = new byte[datalength + PacketHead + 4]; // 前4字节为已接受多少数据
                        bigsegmentbuff.Add(key, b);
                        Array.Copy(buff, buffindex, bigsegmentbuff[key], 4, PacketLength);
                        bigsegmentbuff[key][0] = (byte)(PacketLength);
                        bigsegmentbuff[key][1] = (byte)(PacketLength >> 8);
                        bigsegmentbuff[key][2] = (byte)(PacketLength >> 16);
                        bigsegmentbuff[key][3] = (byte)(PacketLength >> 24);
                    }
                    else
                    {
                        segmentlength = BitConverter.ToUInt32(bigsegmentbuff[key], 0);
                        Array.Copy(buff, buffindex + PacketHead, bigsegmentbuff[key], offset + PacketHead + 4, PacketLength - PacketHead);
                        segmentlength          = segmentlength + PacketLength - PacketHead;
                        bigsegmentbuff[key][0] = (byte)(segmentlength);
                        bigsegmentbuff[key][1] = (byte)(segmentlength >> 8);
                        bigsegmentbuff[key][2] = (byte)(segmentlength >> 16);
                        bigsegmentbuff[key][3] = (byte)(segmentlength >> 24);
                    }
                    segmentlength = BitConverter.ToUInt32(bigsegmentbuff[key], 0);
                    if (segmentlength == bigsegmentbuff[key].Length - 4) //最后一个段
                    {
                        ParseData(bigsegmentbuff[key], 4, segmentlength);
                        bigsegmentbuff.Remove(key);
                    }
                }
            }
        }