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 } }
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"); }
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); } }