Как разрешить IP-адрес/порт между WSL2 и хостом Windows?

Вопрос или проблема

Я пытаюсь научиться использовать Tracy profiler.

Кратко говоря, профилирование вашей программы состоит в том, чтобы включить заголовок Tracy, добавить несколько макросов Tracy в ваш код в местах, которые имеют отношение к вашему профилированию, и собрать ваш проект с определенными флагами компиляции Tracy.

Мои знания о сетевом взаимодействии не очень прочные, но если я правильно понимаю, ваша скомпилированная программа (с макросами профилирования Tracy) отправляет “объявления присутствия” через UDP-сообщения на 127.0.0.1:8086, и сервер Tracy прослушивает UDP-сообщения по этому адресу, затем подключается к клиенту по TCP (да: сервер подключается к клиенту).

Я скомпилировал свою программу на Linux, конкретно, Ubuntu WSL2, работающей на Windows 10. Когда я запускаю Tracy Profiler, tracy-profiler.exe в среде Windows (я думаю, это синоним “сервера Tracy”, но я не уверен на 100%), подключаясь к 127.0.0.1, и запускаю свою программу в экземпляре Ubuntu WSL, профайлер застревает на этапе “Ожидание подключения…” (скриншот ниже)

Описание изображения здесь

Я думаю, что внедрил Tracy в свой код правильно, поэтому считаю, что это не проблема с интеграцией клиента Tracy в мой код или использованием профайлера Tracy, а скорее проблема с “сетевым взаимодействием” между Ubuntu WSL и “нативной”/содержащей средой Windows. Я не очень хорошо это понимаю, но мне кажется, что 127.0.0.1 с точки зрения Ubuntu WSL “отличается” от точки зрения Windows(?) Поэтому я думаю, даже если мой внедренный Tracy программой отправляет на “127.0.0.1:8086“, а мой профайлер Tracy слушает на “127.0.0.1:8086“, они на самом деле не ссылаются на один и тот же IP/порт(?).

Если это правильно, не могли бы вы посоветовать, как я могу заставить клиент и сервер Tracy транслировать/слушать на “одном” адресе/порту, чтобы профайлер Tracy мог действительно профилировать, что отправляет мое приложение?

Ответ или решение

Решение проблемы подключения между WSL2 и Windows с использованием профайлера Tracy

Теория

Профайлинг является важной частью процесса разработки программного обеспечения, позволяя детально измерять производительность программы и оптимизировать узкие места. В данном случае, вы используете Tracy — популярный инструмент для профайлинга, который предоставляет мощные функции для анализа работы вашего кода.

Вам необходимо настроить сеть между Windows Subsystem for Linux (WSL2) и вашим Windows-хостом. Главное понимание, которое нужно вынести из вашего вопроса, заключается в особенностях взаимодействия IP-адресов внутри WSL2 и в Windows. В WSL2, каждая сессия запускается с собственным виртуализированным сетевым интерфейсом, и фактически она находится в своей изолированной сети, что делает доступ к 127.0.0.1 из Windows невозможным, так как это локальный адрес только в среде WSL2.

Когда вы запускаете приложение с профайлингом в WSL2, оно пытается отправлять UDP-сообщения на 127.0.0.1:8086, однако, это сообщение никогда не достигает вашего хоста Windows, так как на Windows под этим адресом находится другая сетевая изоляция.

Пример

Представьте, что WSL2 и ваш ПК на Windows — это две разные квартиры в одном многоквартирном доме. Заказанный вами почтовый адрес 127.0.0.1 — это адрес почтового ящика прямо внутри вашей квартиры, и он не доступен снаружи. Таким образом, даже если вы отправляете письма с этого адреса, они не могут попасть в другую квартиру, если вы не делаете явных действий по пересылке.

Для вашего случая с Tracy сервером, вам нужно, чтобы отправка данных с вашей программы из WSL2 достигала вашего Windows-хоста. Это можно организовать путём использования IP-адреса вашего Windows-хоста в сети, в которой находится WSL2, что требует некоторых дополнительных настроек.

Применение

Шаг 1: Получение IP-адреса Windows

Чтобы профайлер смог принимать сетевые сообщения из WSL2, вам требуется использовать IP-адрес Windows-хоста, который доступен из среды WSL2. Вы можете узнать текущий IP-адрес вашего Windows-хоста, на который WSL2 сможет отправить данные, выполнив команду в WSL2:

cat /etc/resolv.conf | grep nameserver | awk '{print $2}'

Эта команда выводит IP-адрес вашего Windows-хоста, к которому можно будет обратиться из WSL.

Шаг 2: Настройка программы на отправку данных на правильный IP

Теперь, зная IP-адрес хоста, вам нужно убедиться, что ваша программа отправляет данные на нужный адрес и порт. В коде, где происходит отправка UDP сообщений, вместо использования 127.0.0.1, прописывайте IP-адрес, полученный на первом шаге, с тем же портом 8086.

Шаг 3: (Необязательно) Настройка порта в Windows Firewall

Если после выполнения первых двух шагов соединение не удаётся, убедитесь, что порт 8086 открыт в вашем Windows Firewall. Для этого вам нужно либо временно отключить все правила безопасности, либо создать специальное правило для разрешения трафика на этом порту.

Шаг 4: Запуск профайлера на Windows

Только после того, как всё вышеописанное будет настроено, запускайте ваш tracy-profiler.exe из среды Windows и убедитесь, что он ждёт подключения на том же IP-адресе и порту, которые вы использовали в коде WSL2. Это, как правило, IP вашего Windows-хоста, полученный ранее.

Заключение

Таким образом, ключом к разрешению проблемы является правильная настройка сетевого взаимодействия между WSL2 и Windows. Понимание того, что 127.0.0.1 в WSL2 это не то же самое, что 127.0.0.1 в Windows — важнейший шаг к решению. Используйте адрес вашего Windows-хоста в сети WSL2 для обеспечения корректного обмена данными между вашей программой и профайлером Tracy.

Оцените материал
Добавить комментарий

Капча загружается...