/// <summary> /// Sends a message that indicates this peer is about to quit. This is an RPC. /// </summary> /// <param name="remotePeer">The remote peer to send this request.</param> /// <param name="shutdownBuilder">Used for the sign and force TCP flag. Set if the message should be signed.</param> /// <param name="channelCreator">The channel creator that creates connections.</param> /// <returns>The future response message.</returns> public Task<Message.Message> QuitAsync(PeerAddress remotePeer, ShutdownBuilder shutdownBuilder, ChannelCreator channelCreator) { var message = CreateRequestMessage(remotePeer, Rpc.Commands.Quit.GetNr(), Message.Message.MessageType.RequestFf1); if (shutdownBuilder.IsSign) { message.SetPublicKeyAndSign(shutdownBuilder.KeyPair); } var tcsResponse = new TaskCompletionSource<Message.Message>(message); var requestHandler = new RequestHandler(tcsResponse, PeerBean, ConnectionBean, shutdownBuilder); Logger.Debug("Send QUIT message {0}.", message); if (!shutdownBuilder.IsForceTcp) { return requestHandler.FireAndForgetUdpAsync(channelCreator); } return requestHandler.SendTcpAsync(channelCreator); }
public Task<Message.Message> SendAsync(PeerAddress remotePeer, BroadcastBuilder broadcastBuilder, ChannelCreator channelCreator, IConnectionConfiguration configuration) { var message = CreateRequestMessage(remotePeer, Rpc.Commands.Broadcast.GetNr(), Message.Message.MessageType.RequestFf1); message.SetIntValue(broadcastBuilder.HopCounter); message.SetKey(broadcastBuilder.MessageKey); if (broadcastBuilder.DataMap != null) { message.SetDataMap(new DataMap(broadcastBuilder.DataMap)); } var tcsResponse = new TaskCompletionSource<Message.Message>(message); var requestHandler = new RequestHandler(tcsResponse, PeerBean, ConnectionBean, configuration); if (!broadcastBuilder.IsUdp) { return requestHandler.SendTcpAsync(channelCreator); } else { return requestHandler.FireAndForgetUdpAsync(channelCreator); } }