Имеется Linux с множеством сетевых интерфейсов (ppp) и есть надобность программно отправлять сетевые запросы через разные сетевые интерфейсы аналогично тому как это делается средствами
curl --interface.
Нашел вот такое решение:
static async Task Main(string[] args)
{
var iface = NetworkInterface.GetAllNetworkInterfaces().Where(ad => ad.Name == args[0]).FirstOrDefault();
var ip = iface.GetIPProperties().UnicastAddresses.Where(ip => ip.Address.AddressFamily ==
System.Net.Sockets.AddressFamily.InterNetwork).Select(ip => ip.Address).FirstOrDefault();
using var client = GetHttpClient(ip);
Console.WriteLine($"You interface {iface.Name} and IP is {ip.ToString()}");
client.DefaultRequestHeaders.Add("User-Agent", "curl/7.55.1");
var content = await client.GetStringAsync(args[1]);
Console.WriteLine(content);
}
public static HttpClient GetHttpClient(IPAddress address)
{
if (IPAddress.Any.Equals(address))
return new HttpClient();
SocketsHttpHandler handler = new SocketsHttpHandler();
handler.ConnectCallback = async (context, cancellationToken) =>
{
Socket socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(address, 0));
socket.NoDelay = true;
try
{
await socket.ConnectAsync(context.DnsEndPoint, cancellationToken).ConfigureAwait(false);
return new NetworkStream(socket, true);
}
catch
{
socket.Dispose();
throw;
}
};
return new HttpClient(handler);
}
но оно работает только если в качестве интерфейса выбирать основной ens*, в то время как
curl --interface работает без проблем и с ppp*.
Подскажите, как это можно корректно исправить или как по другому возможно реализовать?
P.S. Запуск от root ничего не меняет.