Задать вопрос
Adler_lug
@Adler_lug

Как выбрать сетевой интерфейс для HTTP запроса средствами C# в Linux?

Имеется 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 ничего не меняет.
Скриншот демонстрации
QDRZ3XF.png
  • Вопрос задан
  • 301 просмотр
Подписаться 3 Средний 8 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы