public void Connect(string host, ServiceFlags serviceFlag) { if (string.IsNullOrWhiteSpace(host)) { throw new ArgumentNullException(nameof(host)); } var iid = Interop.Constants.InterfaceId; var port = PortsHelper.GetPort(_network); IPAddress ipAdr = null; if (!IPAddress.TryParse(host, out ipAdr)) { // TODO : Throw an exception. } var adrBytes = ipAdr.MapToIPv6().GetAddressBytes(); _serviceFlag = serviceFlag; _currentIpAddress = new IpAddress(serviceFlag, adrBytes, ushort.Parse(port)); // _client = new RpcClientApi(iid, RpcProtseq.ncacn_ip_tcp, host, port); _client = new RpcClientApi(iid, RpcProtseq.ncalrpc, null, host); // Connection to peers : https://bitcoin.org/en/developer-guide#connecting-to-peers var instance = PeersStore.Instance(); var transmittingNode = instance.GetMyIpAddress(); var nonce = NonceHelper.GetNonceUInt64(); var versionMessage = new VersionMessage(transmittingNode, _currentIpAddress, nonce, string.Empty, 0, false, _network); try { _peerConnection = new PeerConnection(adrBytes); var result = _messageCoordinator.Launch(this, versionMessage); if (result != null && result is VerackMessage) { _peerConnection.Connect(); if (ConnectEvent != null) { ConnectEvent(this, new IpAddressEventArgs(_currentIpAddress)); } _timer = new Timer(TimerElapsed, _autoEvent, CHECK_INTERVAL, CHECK_INTERVAL); // CHECK PEERS AVAILABILITY EVERY 60 SECONDS. } } catch (Interop.RpcException) { throw new PeerConnectorException(ErrorCodes.PeerRpcError); } }
public void Start(IEnumerable <byte> ipAddress = null) { if (ipAddress == null) { ipAddress = _ipAdrHelper.GetIpv4Address(); } _ipAddress = new IpAddress(DateTime.UtcNow, _serviceFlag, ipAddress.ToArray(), ushort.Parse(PortsHelper.GetPort(_network))); PeersStore.Instance().SetMyIpAddress(_ipAddress); var iid = Interop.Constants.InterfaceId; var instance = PeersStore.Instance(); var port = PortsHelper.GetPort(_network); // _server = new RpcServerApi(iid, 1234, -1, true); // _server.AddProtocol(RpcProtseq.ncacn_ip_tcp, port, 5); var name = (new IPAddress(_ipAddress.Ipv6)).MapToIPv4().ToString(); // USE QUEUE. _server = new RpcServerApi(iid, 1234, -1, true); _server.AddProtocol(RpcProtseq.ncalrpc, name, 5); _server.StartListening(); _server.OnExecute += delegate(IRpcClientInfo client, byte[] arg) { var message = _messageParser.Parse(arg); var connectedPeer = _p2pNetworkConnector.GetPeer(message.MessageHeader.Ipv6); if (NewMessageEvent != null) { NewMessageEvent(this, new StringEventArgs(message.GetCommandName())); } var response = _messageCoordinator.Receive(message, connectedPeer, _p2pNetworkConnector); if (response == null) { return(new byte[0]); } return(response.Serialize()); }; if (StartNodeEvent != null) { StartNodeEvent(this, EventArgs.Empty); } }