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