DotNet позволяет двум процессам открывать один и тот же порт? - PullRequest
0 голосов
/ 07 февраля 2019

Я запускаю службу DotNet в контейнере Docker centos:7, и у меня возникают проблемы с кодом, который мне дали работать по-другому в ситуации dotnet publish против dotnet run.

В настоящее время у меня запущена служба dotnet, которая прослушивает порт 3480.Похоже, что код dotnet, который я использую, также пытается создать экземпляр TcpListener на том же порту.

В режиме dotnet run он появляется , чтобы это произошло, как в публикацииЯ получаю ошибку address in use.

Поэтому, прежде чем запустить свой код, у меня есть net stat -lntp

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:3840            0.0.0.0:*               LISTEN      5017/dotnet
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      -

, где pid 5017 , моя служба прослушиваетTCP-порт

После запуска мой код выглядит следующим образом:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        1      0 0.0.0.0:3840            0.0.0.0:*               LISTEN      5247/dotnet
tcp        0      0 172.17.0.2:4000         0.0.0.0:*               LISTEN      5247/dotnet
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      -

PID 5247 , кажется, вступил во владение ??

Затемкогда я завершаю код, мы возвращаемся в это состояние:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:3840            0.0.0.0:*               LISTEN      5017/dotnet
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      -

Единственное отличие, которое я могу придумать, это когда я ps -eo pid, command получаю следующее:

 5017 /usr/bin/dotnet /usr/share/my-agent/My.Agent.Linux.dll
 5247 dotnet exec /devel/SandBox/bin/Debug/netcoreapp2.0/ServerSandbox.dll

Если я запускаю опубликованную версию dotnet publish -o publish -r linux-x64 -c Debug, я получаю это:

 5017 /usr/bin/dotnet /usr/share/my-agent/My.Agent.Linux.dll
 8405 ./publish/My.ServerSandbox

И, когда код выходит из строя, управляющий порт PID 4080 остается прежним.

Мой хотя бы процесс заключается в том, что DotNet Runtime каким-то образом фактически управляет самими портами - именно поэтому он позволяет открыть один и тот же порт дважды, тогда как при публикации моего кода я используювстроенная среда выполнения и, таким образом, мы попадаемся на то, что не должно происходить.

Кто-нибудь видел такое поведение раньше?Я бегал кругами по поводу того, почему я не смог заставить опубликованную версию работать, и после копания я считаю, что ее версия запуска не должна работать.

Спасибо за любой совет/ помощь, которую вы можете предложить.

1 Ответ

0 голосов
/ 15 февраля 2019

После некоторых исследований выяснилось, что наш сервер делал именно то, что мы и подозревали.Мы изменили наш исходный код, чтобы не открывать один и тот же порт дважды, и все пошло на шаг.Относительно того, почему это вообще возможно, я все еще в замешательстве - поэтому, если вы столкнулись с подобной ситуацией, надеюсь, этот вопрос может предложить вам некоторое утешение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...