На приведенном ниже рисунке показаны 2 процесса, которые пытались и успешно связали сокеты-сокеты (сервер) с портом 10000 на моем локальном компьютере:
и здесь вывод netstat (для подтверждения):
netstat -a -n | find "10000"
TCP 0.0.0.0:10000 0.0.0.0:0 LISTENING
TCP 0.0.0.0:10000 0.0.0.0:0 LISTENING
TCP [::]:10000 [::]:0 LISTENING
(NB: процесс javaw.exe был первым, кто открыл сокет для прослушивания на 10000).
Пока я знаю ситуации, при которых несколько процессов могут прослушиваться на одном и том же порту (SO_REUSEADDR
), есть определенные вещи, которые мешают мне в моем конкретном сценарий:
-
В моем приложении я специально говорю .NET, что я хочу эксклюзивное сокет прослушивания (
SO_EXCLUSIVEADDRUSE
) черезlistener = new TcpListener(adr, ipport); listener.ExclusiveAddressUse = true;
-
.NET делает not выдачу каких-либо исключений/ошибок/уведомлений о том, что порт уже используется. На самом деле, он на самом деле считает, что все прошло хорошо.
-
Моя серверная программа никогда не просыпается от вызова
listener.AcceptTcpClient()
с этого момента. Клиентское приложение, которое должно взаимодействовать с сервером, получает действительное соединение, но не может связываться с "моим" сервером (предположительно потому, что оно устанавливает соединение с "другим" процессом, который не говорит о его "протоколе" ).
В случае, если кто-то хочет попытаться воспроизвести мои выводы: Второй процесс - это выпуск Helix для Eclipse (PHP). Но конкретный процесс не должен иметь значения здесь: если один процесс может делать странные вещи под ОС, так что другие могут.
Любые советы о том, как я могу либо получить ошибку, либо вообще предотвратить такую ситуацию (с помощью дополнительных параметров)?