2013-09-26 5 views
2

Мне нужно проверить, свободен ли TCP-порт. Я написал этот метод:Проверьте, доступен ли локальный TCP-порт

private bool freePort(int port) { 
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    IAsyncResult result = socket.BeginConnect(IPAddress.Loopback, port, null, null); 
    bool success = result.AsyncWaitHandle.WaitOne(1000, true); 
    try{ 
     socket.Close(); 
    }catch(Exception){} 
    return !success; 
} 

Это работает в Windows 7, но не в Windows XP.

В WinXP иногда работает, а иногда дает ложный ответ ...

+0

Если никто не имеет хорошей идеи, вы можете проверить, можете ли вы открыть сокет для этого порта. Он может давать разные результаты в зависимости от адреса, который вы используете для обозначения себя. –

+0

Что происходит в других 80% случаев? Это очень неправильный код, если вы обнаружите, что он свободен, тогда у вас нет никакой гарантии, что он по-прежнему свободен на наносекунду позже, другой процесс может открыть порт. Такая же логика для Windows не имеет функции, чтобы проверить, заблокирован ли файл. –

+0

Хорошо, это не может быть на 100% уверенным, но мне нужно всего лишь проверить перед запуском процесса apache. Если что-то уже запущено и прослушивается на tcp 80, я могу получить его и остановить процесс. Проблема в том, почему в XP иногда работает, а иногда и не работает. – Tobia

ответ

1

Это, вероятно, лучше точно пытаться, что Apache будет пытаться: открыть порт, вместо подключения к нему.

using (var listener = new TcpListener(IPAddress.Loopback, port)) 
    listener.Start(); 
Смежные вопросы