void remoteReceive(IAsyncResult ar) { NatEntryValue natEntry = ar.AsyncState as NatEntryValue; EndPoint recipientEndPoint = new IPEndPoint(0, 0); int size = natEntry.RemoteSocket.EndReceiveFrom(ar, ref recipientEndPoint); if (size > 0) { Packet packet = new Packet { FromEndPoint = remoteEndPoint, PacketData = natEntry.Buffer, ToEndPoint = natEntry.LocalEndPoint as IPEndPoint, PacketSize = size, IsIncoming = true }; if (PacketFilter != null) { PacketFilter(packet); } udpListener.SendTo(packet.PacketData, packet.PacketSize, SocketFlags.None, natEntry.LocalEndPoint); } if ((DateTime.UtcNow - natEntry.TimeStamp).TotalMilliseconds < NatLifeTime) { natEntry.RemoteSocket.BeginReceiveFrom(natEntry.Buffer, 0, natEntry.Buffer.Length, SocketFlags.None, ref recipientEndPoint, new AsyncCallback(remoteReceive), ar.AsyncState); } }
void listenerReceive(IAsyncResult ar) { EndPoint recipientEndPoint = new IPEndPoint(0, 0); int size = udpListener.EndReceiveFrom(ar, ref recipientEndPoint); byte[] buffer = ar.AsyncState as byte[]; if (size > 0) { NatEntryValue natEntry = null; lock (natTable) { natTable.TryGetValue(recipientEndPoint, out natEntry); } if (natEntry == null) { natEntry = new NatEntryValue { RemoteSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp), TimeStamp = DateTime.UtcNow, Buffer = new byte[buffer.Length], LocalEndPoint = recipientEndPoint }; natEntry.RemoteSocket.Connect(remoteEndPoint); EndPoint nullEndPoint = new IPEndPoint(0, 0); natEntry.RemoteSocket.BeginReceiveFrom(natEntry.Buffer, 0, natEntry.Buffer.Length, SocketFlags.None, ref nullEndPoint, new AsyncCallback(remoteReceive), natEntry); lock (natTable) { natTable.Add(recipientEndPoint, natEntry); } } natEntry.TimeStamp = DateTime.UtcNow; Packet packet = new Packet { FromEndPoint = recipientEndPoint as IPEndPoint, PacketData = buffer, ToEndPoint = remoteEndPoint, PacketSize = size, IsIncoming = false }; if (PacketFilter != null) { PacketFilter(packet); } natEntry.RemoteSocket.SendTo(packet.PacketData, packet.PacketSize, SocketFlags.None, remoteEndPoint); } recipientEndPoint = new IPEndPoint(0, 0); udpListener.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref recipientEndPoint, new AsyncCallback(listenerReceive), ar.AsyncState); }