public void SendReliableFragmented() { _sock.MaxPayload = 3; Utils.SendConnectRequest(_bareSock, _remoteEndPoint, _bufferPool); var receivedPacket = new ReceivedSmartPacket(); Assert.IsFalse(_sock.Receive(ref receivedPacket)); var ms = new MemoryStream(); ms.Write(BitConverter.GetBytes((ushort)12345), 0, 2); ms.Write(new byte[] { 77 }, 0, 1); ms.Write(BitConverter.GetBytes((ushort)23456), 0, 2); var buffer = ms.ToArray(); _sock.Send(_remoteEndPoint, buffer, 0, buffer.Length, true); Assert.AreEqual(3, _bareSock.Sends.Count); // 2 for payload + connect response var packetToSend = _bareSock.Sends[1]; var header = new PacketHeader(); header.Init(packetToSend.Buffer, packetToSend.Offset); Assert.AreEqual(_sock.MaxPayload + header.HeaderLength, header.Length); Assert.AreEqual(12345, BitConverter.ToInt16(packetToSend.Buffer, header.HeaderLength)); Assert.AreEqual(0, header.SeqNum); Assert.IsTrue(header.GetNeedAck()); Assert.IsFalse(packetToSend.PutBufferToPool, "Reliable packets should wait for Ack before going to pool"); packetToSend = _bareSock.Sends[2]; header = new PacketHeader(); header.Init(packetToSend.Buffer, packetToSend.Offset); Assert.AreEqual(buffer.Length - _sock.MaxPayload + header.HeaderLength, header.Length); Assert.AreEqual(23456, BitConverter.ToInt16(packetToSend.Buffer, header.HeaderLength)); Assert.AreEqual(1, header.SeqNum); Assert.IsTrue(header.GetNeedAck()); Assert.IsFalse(packetToSend.PutBufferToPool, "Reliable packets should wait for Ack before going to pool"); // Ack buffers var header1 = new PacketHeader(); header1.AddAck(0); header1.AddAck(1); header1.SetSeqNum(1); header1.Length = (ushort)header1.HeaderLength; var buffer1 = _bufferPool.Get(header1.Length); header1.WriteTo(buffer1, 0); _bareSock.FakeReceive(buffer1, 0, header1.Length, _remoteEndPoint); var receivedPackets = Utils.ReceiveAll(_sock); }
public void AcksPacketIsPutToPool() { var header = new PacketHeader(); header.AddAck(1); header.AddAck(2); header.AddAck(3); TestWith(header); }
public void NotReSendAfterAckAndTimeout() { _sock.AckTimeout = 1; var remoteEndPoint = new IPEndPoint(IPAddress.Loopback, 23452); Utils.SendConnectRequest(_bareSock, remoteEndPoint, _bufferPool); var receivedPacket = new ReceivedSmartPacket(); Assert.IsFalse(_sock.Receive(ref receivedPacket)); var buffer = BitConverter.GetBytes(123456789); _sock.Send(remoteEndPoint, buffer, 0, buffer.Length, true); var sent = _bareSock.Sends[1]; var headerSent = new PacketHeader(); headerSent.Init(sent.Buffer, sent.Offset); var ackHeader = new PacketHeader(); ackHeader.AddAck(headerSent.SeqNum); ackHeader.Length = (ushort)ackHeader.HeaderLength; buffer = _bufferPool.Get(ackHeader.Length); ackHeader.WriteTo(buffer, 0); _bareSock.FakeReceive(buffer, 0, ackHeader.Length, new IPEndPoint(IPAddress.Loopback, 23452)); receivedPacket = new ReceivedSmartPacket(); // Just ack in the packet, no payload Assert.IsFalse(_sock.Receive(ref receivedPacket)); Thread.Sleep(20); _sock.Tick(); Assert.AreEqual(2, _bareSock.Sends.Count); }