Exemple #1
0
        void ProcessReceivedPeersList(ConnectedPeer connectedPeer, PeersListPacketIpv4 peersListPacket, IPEndPoint remoteEndpoint)
        {
            if (!connectedPeer.Streams.TryGetValue(peersListPacket.StreamId, out var localStream))
            {
                _localPeer.Firewall.OnUnauthenticatedReceivedPacket(remoteEndpoint);
                return;
            }

            foreach (var receivedSharedPeer in peersListPacket.SharedPeers)
            {
                if (receivedSharedPeer.ToPeerId.Equals(_localPeer.LocalPeerId))
                {
                    continue;                                                             // dont connect to this peer
                }
                if (!_connectedPeers.TryGetValue(receivedSharedPeer.ToPeerId, out var localConnectedPeer))
                {
                    _localPeer.WriteToLog_deepDetail(LogModules.PeerSharing, $"received shared peer {receivedSharedPeer}) from {connectedPeer}");
                    localConnectedPeer = new ConnectedPeer(_localPeer, receivedSharedPeer.ToPeerId, ConnectedPeerType.toPeerShared, receivedSharedPeer.ToEndPoint.Address);
                    lock (_connectedPeers)
                        _connectedPeers.Add(receivedSharedPeer.ToPeerId, localConnectedPeer);
                }
                if (!localConnectedPeer.Streams.Values.Any(x => x.RemoteEndPoint.Equals(receivedSharedPeer.ToEndPoint)))
                {
                    if (connectedPeer.Streams.TryGetValue(receivedSharedPeer.FromSocketAtStreamId, out var fromStreamSocket))
                    {
                        localConnectedPeer.TryAddStream(
                            fromStreamSocket.Socket,
                            receivedSharedPeer.ToEndPoint, null);
                    }
                } // else there is already connected stream to this remote peer endpoint
            }
        }
Exemple #2
0
 internal void ProcessReceivedSharedPeers(byte[] data, IPEndPoint remoteEndpoint)
 {
     // enqueue into manager thread // reduce load of the receiver thread
     _actionsQueue.Enqueue(() =>
     {
         var peersListPacket = new PeersListPacketIpv4(data);
         if (_connectedPeers.TryGetValue(peersListPacket.FromPeerId, out var connectedPeer))
         { //authorized here
             ProcessReceivedPeersList(connectedPeer, peersListPacket, remoteEndpoint);
         }
         else
         {
             _localPeer.Firewall.OnUnauthenticatedReceivedPacket(remoteEndpoint);
         }
     }, "ProcessReceivedSharedPeers5670");
 }
Exemple #3
0
        void ShareConnectedPeers(ConnectedPeer connectedPeer1, ConnectedPeer connectedPeer2, DateTime now)
        {
            try
            {
                var streams1 = SelectWithUniqueRemoteEndPoints(connectedPeer1.Streams.Values.Where(x => x.IsIdle(now, LocalLogicConfiguration.MaxPeerIdleTime_ToShare) == false)).ToArray();
                var streams2 = SelectWithUniqueRemoteEndPoints(connectedPeer2.Streams.Values.Where(x => x.IsIdle(now, LocalLogicConfiguration.MaxPeerIdleTime_ToShare) == false)).ToArray();
                var l        = Math.Min(streams1.Length, streams2.Length);
                if (l == 0)
                {
                    return;
                }
                var stream1 = streams1[0];
                var stream2 = streams2[0];
                if (stream1.RemoteEndPoint.Address.Equals(stream2.RemoteEndPoint.Address))
                {
                    return;                                                                        // dont connect peers across lan (from same IP)
                }
                var itemsForPacket1 = new PeersListPacket_SharedPeerIpv4[l];
                var itemsForPacket2 = new PeersListPacket_SharedPeerIpv4[l];
                for (int i = 0; i < l; i++)
                {
                    itemsForPacket1[i] = new PeersListPacket_SharedPeerIpv4(streams1[i].StreamId, connectedPeer2.RemotePeerId, streams2[i].RemoteEndPoint);
                    itemsForPacket2[i] = new PeersListPacket_SharedPeerIpv4(streams2[i].StreamId, connectedPeer1.RemotePeerId, streams1[i].RemoteEndPoint);
                }

                var data1 = new PeersListPacketIpv4(itemsForPacket1, _localPeer.LocalPeerId, stream1.StreamId).Encode();
                stream1.Socket.UdpSocket.Send(data1, data1.Length, stream1.RemoteEndPoint);

                var data2 = new PeersListPacketIpv4(itemsForPacket2, _localPeer.LocalPeerId, stream2.StreamId).Encode();
                stream2.Socket.UdpSocket.Send(data2, data2.Length, stream2.RemoteEndPoint);
            }
            catch (Exception exc)
            {
                _localPeer.HandleException(LogModules.PeerSharing, exc);
            }
        }