btcpayserver/BTCPayServer/Services/SocketFactory.cs

65 lines
1.7 KiB
C#
Raw Normal View History

using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using BTCPayServer.Configuration;
using NBitcoin.Protocol;
2020-06-28 10:55:27 +02:00
using NBitcoin.Protocol.Connectors;
namespace BTCPayServer.Services
{
public class SocketFactory
{
private readonly BTCPayServerOptions _options;
2020-03-13 15:10:26 +01:00
public SocketFactory(BTCPayServerOptions options)
{
_options = options;
}
2020-03-13 15:10:26 +01:00
2019-03-31 06:16:05 +02:00
public async Task<Socket> ConnectAsync(EndPoint endPoint, CancellationToken cancellationToken)
{
DefaultEndpointConnector connector = new DefaultEndpointConnector();
NodeConnectionParameters connectionParameters = new NodeConnectionParameters();
if (_options.SocksEndpoint != null)
{
connectionParameters.TemplateBehaviors.Add(new NBitcoin.Protocol.Behaviors.SocksSettingsBehavior()
{
SocksEndpoint = _options.SocksEndpoint
});
}
2020-03-13 15:10:26 +01:00
var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
try
{
await connector.ConnectSocket(socket, endPoint, connectionParameters, cancellationToken);
}
catch
{
SafeCloseSocket(socket);
}
2020-03-13 15:10:26 +01:00
return socket;
}
internal static void SafeCloseSocket(Socket socket)
{
try
{
socket.Shutdown(SocketShutdown.Both);
}
catch
{
}
2020-03-13 15:10:26 +01:00
try
{
socket.Dispose();
}
catch
{
}
}
}
}