public void TestConsolidate() { // Ensure result wilbe distributed across multiple packets TransportPacket.ReservedInitialBytes = 0; TransportPacket packet = new TransportPacket(new byte[] { 9 }); packet.Prepend(new byte[] { 4, 5, 6, 7, 8 }); packet.Prepend(new byte[] { 0, 1, 2, 3 }); Assert.IsTrue(((IList<ArraySegment<byte>>)packet).Count > 1); packet.Consolidate(); Assert.AreEqual(1, ((IList<ArraySegment<byte>>)packet).Count); Assert.AreEqual(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }, packet.ToArray()); CheckDisposed(packet); CheckForUndisposedSegments(); }
public void TestDisposal() { TransportPacket packet = new TransportPacket(10); packet.Dispose(); try { packet.Grow(20); Assert.Fail("should have thrown ObjectDisposedException"); } catch(ObjectDisposedException) { /* expected */ } try { packet.RemoveBytes(0,2); Assert.Fail("should have thrown ObjectDisposedException"); } catch(ObjectDisposedException) { /* expected */ } try { packet.ByteAt(0); Assert.Fail("should have thrown ObjectDisposedException"); } catch(ObjectDisposedException) { /* expected */ } try { packet.Consolidate(); Assert.Fail("should have thrown ObjectDisposedException"); } catch(ObjectDisposedException) { /* expected */ } try { packet.Prepend(new byte[0]); Assert.Fail("should have thrown ObjectDisposedException"); } catch (ObjectDisposedException) { /* expected */ } try { packet.Append(new byte[0]); Assert.Fail("should have thrown ObjectDisposedException"); } catch (ObjectDisposedException) { /* expected */ } try { Console.WriteLine(packet.Length); Assert.Fail("should have thrown ObjectDisposedException"); } catch (ObjectDisposedException) { /* expected */ } }
/// <summary> /// Send a packet on the UDP socket. /// </summary> /// <exception cref="SocketException">thrown if there is a socket error</exception> public int Send(TransportPacket packet, EndPoint remote) { // Is our throwing a SocketException considered out of line? if (!Active) { throw new SocketException((int)SocketError.Shutdown); } // Sadly SentTo does not support being provided a IList<ArraySegment<byte>> packet.Consolidate(); // try to reduce to a single segment IList<ArraySegment<byte>> bytes = packet; if (bytes.Count == 1) { return udpClient.Client.SendTo(bytes[0].Array, bytes[0].Offset, bytes[0].Count, SocketFlags.None, remote); } // hopefully this won't happen often; we could maintain our own bytearray pool return udpClient.Client.SendTo(packet.ToArray(), SocketFlags.None, remote); }