예제 #1
0
        public void Connect(string host, int port)
        {
            var endpoint = IPAddress.Parse(host);

            mSocket = new Socket(endpoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
            mSocket.Connect(endpoint, port);
            mKCP = new KCP((uint)(new Random().Next(1, Int32.MaxValue)), rawSend);
            // normal:  0, 40, 2, 1
            // fast:    0, 30, 2, 1
            // fast2:   1, 20, 2, 1
            // fast3:   1, 10, 2, 1
            mKCP.NoDelay(0, 30, 2, 1);
            mRecvBuffer.Clear();
        }
예제 #2
0
        public void Connect(string host, int port)
        {
            var endpoint = IPAddress.Parse(host);

            mSocket = new Socket(endpoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
            mSocket.Connect(endpoint, port);
            mKCP = new KCP((uint)mConv, rawSend);
            //            mKCP = new KCP((uint)UDPProtocolType.eUDPPT_CONNECT_REQ, rawSend);
            // normal:  0, 40, 2, 1
            // fast:    0, 30, 2, 1
            // fast2:   1, 20, 2, 1
            // fast3:   1, 10, 2, 1
            mKCP.NoDelay(0, 30, 2, 1);
            mRecvBuffer.Clear();
        }
예제 #3
0
        public void Connect(string host, int port, BlockCrypt b)
        {
            var endpoint = IPAddress.Parse(host);

            mSocket = new Socket(endpoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
            mSocket.Connect(endpoint, port);
            mKCP = new KCP((uint)(new Random().Next(1, Int32.MaxValue)), rawSend);
            // normal:  0, 40, 2, 1
            // fast:    0, 30, 2, 1
            // fast2:   1, 20, 2, 1
            // fast3:   1, 10, 2, 1
            mKCP.NoDelay(0, 30, 2, 1);
            mRecvBuffer.Clear();
            headerSize = 0;
            block      = b;
            if (block != null)
            {
                headerSize += cryptHeaderSize;
            }

            mKCP.ReserveBytes(headerSize);
        }
예제 #4
0
        public void Connect(string host, int port)
        {
            IPHostEntry hostEntry = Dns.GetHostEntry(host);

            if (hostEntry.AddressList.Length == 0)
            {
                throw new Exception("Unable to resolve host: " + host);
            }
            var endpoint = hostEntry.AddressList[0];

            mSocket = new Socket(endpoint.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
            mSocket.Connect(endpoint, port);
            RemoteAddress = (IPEndPoint)mSocket.RemoteEndPoint;
            LocalAddress  = (IPEndPoint)mSocket.LocalEndPoint;
            mKCP          = new KCP((uint)(new Random().Next(1, Int32.MaxValue)), rawSend);
            // normal:  0, 40, 2, 1
            // fast:    0, 30, 2, 1
            // fast2:   1, 20, 2, 1
            // fast3:   1, 10, 2, 1
            mKCP.NoDelay(0, 30, 2, 1);
            mKCP.SetStreamMode(true);
            mRecvBuffer.Clear();
        }
예제 #5
0
        public int Recv(byte[] data, int index, int length)
        {
            // 上次剩下的部分
            if (mRecvBuffer.ReadableBytes > 0)
            {
                var recvBytes = Math.Min(mRecvBuffer.ReadableBytes, length);
                Buffer.BlockCopy(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, data, index, recvBytes);
                mRecvBuffer.ReaderIndex += recvBytes;
                // 读完重置读写指针
                if (mRecvBuffer.ReaderIndex == mRecvBuffer.WriterIndex)
                {
                    mRecvBuffer.Clear();
                }

                return(recvBytes);
            }

            if (mSocket == null)
            {
                return(-1);
            }

            if (!mSocket.Poll(0, SelectMode.SelectRead))
            {
                return(0);
            }

            var rn = 0;

            try
            {
                rn = mSocket.Receive(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, mRecvBuffer.WritableBytes,
                                     SocketFlags.None);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                rn = -1;
            }

            if (rn <= 0)
            {
                return(rn);
            }

            mRecvBuffer.WriterIndex += rn;

            // 检查加密
            if (block != null)
            {
                block.Decrypt(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, mRecvBuffer.ReadableBytes);
                var checksum = Crc32Algorithm.Compute(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex + cryptHeaderSize,
                                                      mRecvBuffer.ReadableBytes - cryptHeaderSize);
                uint data_checksum = 0;
                KCP.ikcp_decode32u(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex + nonceSize, ref data_checksum);
//                Console.WriteLine("checksum "+checksum+" ="+data_checksum);
                if (checksum == data_checksum)
                {
                    mRecvBuffer.ReaderIndex += cryptHeaderSize;
                }
                else
                {
                    // 丢弃数据包
                    rn = -1;
                    return(rn);
                }
            }

            var inputN = mKCP.Input(mRecvBuffer.RawBuffer, mRecvBuffer.ReaderIndex, mRecvBuffer.ReadableBytes, true,
                                    true);

            if (inputN < 0)
            {
                mRecvBuffer.Clear();
                return(inputN);
            }

            mRecvBuffer.Clear();

            // 读完所有完整的消息
            for (;;)
            {
                var size = mKCP.PeekSize();
                if (size <= 0)
                {
                    break;
                }

                mRecvBuffer.EnsureWritableBytes(size);

                var n = mKCP.Recv(mRecvBuffer.RawBuffer, mRecvBuffer.WriterIndex, size);
                if (n > 0)
                {
                    mRecvBuffer.WriterIndex += n;
                }
            }

            // 有数据待接收
            if (mRecvBuffer.ReadableBytes > 0)
            {
                return(Recv(data, index, length));
            }

            return(0);
        }