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 иногда работает, а иногда дает ложный ответ ...
Если никто не имеет хорошей идеи, вы можете проверить, можете ли вы открыть сокет для этого порта. Он может давать разные результаты в зависимости от адреса, который вы используете для обозначения себя. –
Что происходит в других 80% случаев? Это очень неправильный код, если вы обнаружите, что он свободен, тогда у вас нет никакой гарантии, что он по-прежнему свободен на наносекунду позже, другой процесс может открыть порт. Такая же логика для Windows не имеет функции, чтобы проверить, заблокирован ли файл. –
Хорошо, это не может быть на 100% уверенным, но мне нужно всего лишь проверить перед запуском процесса apache. Если что-то уже запущено и прослушивается на tcp 80, я могу получить его и остановить процесс. Проблема в том, почему в XP иногда работает, а иногда и не работает. – Tobia