示例#1
0
        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);
            }
        }
示例#2
0
        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);
        }