// 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(); }
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); }
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; } }