Beispiel #1
0
    // private HuffmanMsg huffmanMsg;

    public void Init()
    {
        recvSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        // recvSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

        sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        // sendSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
        if (CConstVar.IsLocalNetwork)
        {
            sendSocket.EnableBroadcast = true;
            recvSocket.EnableBroadcast = true;
        }
        recvSocket.Blocking = false;
        sendSocket.Blocking = false;

        buffer     = new byte[CConstVar.BUFFER_LIMIT];
        sendBuffer = new byte[CConstVar.BUFFER_LIMIT];
        var localEP = new IPEndPoint(IPAddress.Any, CConstVar.SERVER_PORT);         //可以接受任何ip和端口的消息

        for (int i = 0; i < 10; i++)
        {
            try{
                // CConstVar.LocalPort =
                localEP.Port = CConstVar.SERVER_PORT + i;
                recvSocket.Bind(localEP);

                // OpenSocks(CConstVar.LocalPort);
                break;
            }catch (Exception e) {
            }
        }

        // packetBuffer = new MsgPacket[2];
        packetBuffer = new CircularBuffer <MsgPacket>(30);
        // recvSocket.Listen();

        // remoteEP = new IPEndPoint(IPAddress.Any, 0);
        // IPAddress.IsLoopback(remoteEP.Address);
        curPacket = 0;

        HuffmanMsg.Init();
    }
Beispiel #2
0
    unsafe public int ReadBits(int bits)
    {
        int  value = 0;
        int  get = 0;
        int  i, nbits;
        bool sgn;

        value = 0;
        if (bits < 0)
        {
            bits = -bits;
            sgn  = true;
        }
        else
        {
            sgn = false;
        }
        if (oob)
        {
            if (bits == 8)
            {
                value = bytes[curPos];
                curPos++;
                bit += 8;
            }
            else if (bits == 16)
            {
                value   = CopyLittleShort();
                curPos += 2;
                bit    += 16;
            }
            else if (bits == 32)
            {
                value   = CopyLittleLong();
                curPos += 4;
                bit    += 32;
            }
            else
            {
                CLog.Error("can't read %d bits", bits);
            }
        }
        else
        {
            nbits = 0;
            if ((bits & 7) != 0)
            {
                nbits = bits & 7;
                for (i = 0; i < nbits; i++)
                {
                    value |= (HuffmanMsg.GetBit(bytes, ref this.bit) << i);
                }
                bits = bits - nbits;
            }
            if (bits != 0)
            {
                // HuffmanMsg.OffsetReceive(HuffmanMsg.decompresser.tree, ref get, bytes, ref bit);
                fixed(byte *f = &bytes[0])
                {
                    fixed(int *b = &bit)
                    {
                        for (i = 0; i < bits; i += 8)
                        {
                            HuffmanMsg.HuffOffsetReceive(&get, f, b);
                            value |= (get << (i + nbits));
                        }
                    }
                }
            }
            curPos = (this.bit >> 3) + 1;
        }

        if (sgn)
        {
            if ((value & (1 << (bits - 1))) != 0)
            {
                value |= -1 ^ ((1 << bits) - 1);
            }
        }
        return(value);
    }
Beispiel #3
0
    unsafe public void WriteBits(int value, int bits)
    {
        int i;

        //溢出检查
        if (CConstVar.BUFFER_LIMIT - curSize < 4)
        {
            overflowed = true;
            return;
        }

        if (bits == 0 || bits < -31 || bits > 32)
        {
            CLog.Error("Packet WriteBits: bad bits {0}", bits);
        }

        if (bits != 32)
        {
            if (bits > 0)
            {
                if ((value > ((1 << bits) - 1)) || value < 0)
                {
                    // overflowes++;
                }
            }
            else
            {
                int r = 1 << (bits - 1);
                if ((value > r - 1) || value < -r)
                {
                    // overflowes++;
                }
            }
        }
        if (bits < 0)
        {
            bits = -bits;
        }
        if (oob)
        {
            if (bits == 8)
            {
                bytes[curSize] = (byte)value;
                curSize       += 1;
                bit           += 8;
            }
            else if (bits == 16)
            {
                // value = CopyLittleShort();
                bytes[curSize + 1] = (byte)(value >> 8);
                bytes[curSize]     = (byte)value;

                curSize += 2;
                bit     += 16;
            }
            else if (bits == 32)
            {
                // value = CopyLittleLong();
                bytes[curSize + 3] = (byte)(value >> 24);
                bytes[curSize + 2] = (byte)(value >> 16);
                bytes[curSize + 1] = (byte)(value >> 8);
                bytes[curSize]     = (byte)value;

                // int re1 =  (int)bytes[curSize];
                // int result = (bytes[curSize+3] << 24) + (bytes[curSize+2] << 16) + (bytes[curSize +1] << 8) + (int)bytes[curSize];
                curSize += 4;
                bit     += 32;
            }
            else
            {
                CLog.Error("Can't write {0} bits", bits);
            }
        }
        else
        {
            value &= (int)(0xffffffff >> (32 - bits));
            if ((bits & 7) != 0)
            {
                int nbits = bits & 7;
                for (i = 0; i < nbits; i++)
                {
                    // fixed(byte* tmp = &(bytes[0])){
                    //  fixed(int* b = &bit){
                    //      HuffmanMsg.Huff_putBit((value & 1), tmp, b);
                    //  }
                    // }
                    HuffmanMsg.PutBit((value & 1), bytes, ref bit);
                    value = (value >> 1);
                }
                bits = bits - nbits;
            }
            if (bits != 0)
            {
                for (i = 0; i < bits; i += 8)
                {
                    // HuffmanMsg.OffsetTransmit(HuffmanMsg.compresser, (value & 0xff), bytes, ref bit);
                    fixed(byte *f = &bytes[0])
                    {
                        fixed(int *b = &bit)
                        {
                            HuffmanMsg.HuffOffsetTransmit((value & 0xff), f, b);
                        }
                    }

                    value = (value >> 8);
                }
            }
            curSize = (bit >> 3) + 1;
        }
    }