Как определить, какое приложение прослушивает данный TCP-порт?

Как определить, какое приложение (если оно есть) прослушивает данный TCP-порт в Windows? Вот xampp делает это:

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

Я бы предпочел сделать это в VB.NET и хочу предложить пользователю возможность закрыть это приложение.


person Onlykl    schedule 12.11.2012    source источник
comment
Вы можете вызвать netstat -no и проанализировать его вывод.   -  person vladr    schedule 12.11.2012
comment
Дело в том, что я не буду использовать netstat и тому подобное. Я работаю над каким-то проектом, который используется для управления apache mysql и еще несколькими приложениями, поэтому я хочу попасть в текстовое поле после нажатия кнопки «Пуск», например, порт 80 используется ИМЯ ПРИЛОЖЕНИЯ и Apache не может быть запущен. ?   -  person Onlykl    schedule 12.11.2012
comment
Не уверен, почему это привлекло так много отрицательных голосов. Это законный вопрос с лучшим ответом, чем Process.Start(netstat -no). Если на сайт приходит новый пользователь и публикует вопрос, который можно улучшить, пожалуйста, следуйте FAQ и помогите пользователю улучшить вопрос и/или сообщите ему, что с ним не так.   -  person Eric J.    schedule 12.11.2012
comment
Может, из-за моей плохой грамматики :) Эрик, можешь помочь мне по почте?   -  person Onlykl    schedule 12.11.2012
comment
@Onlykl: Нет, это не пойдет на пользу более широкому сообществу. Тем не менее, я опубликовал хороший ответ на ваш вопрос.   -  person Eric J.    schedule 12.11.2012
comment
Да, но это C#, и я его не понимаю xD   -  person Onlykl    schedule 12.11.2012
comment
Onlykl, главное, что следует вынести из ответа Эрика, — это вызов API Win32 для использования (GetExtendedTcpTable). Вам нужно будет P/вызвать его; Здесь очень полезен pinvoke.net.   -  person Michael Petrotta    schedule 12.11.2012
comment
@Onlykl: преобразовать в VB.NET с помощью доступных бесплатных конвертеров?   -  person Neolisk    schedule 12.11.2012
comment
@Neolisk: На самом деле похоже, что есть несколько старых вопросов SO, которые указывают на ту же статью Code Project, которую я нашел в Google. Голосование за закрытие как дубликата.   -  person Eric J.    schedule 12.11.2012
comment
возможный дубликат Какой PID прослушивает данный порт в С# (еще один вопрос вернулся)   -  person Michael Petrotta    schedule 12.11.2012
comment
@Onlykl: вы можете P/Invoke из VB.Net так же легко, как и из C#. Вероятно, было бы лучше, если бы вы прочитали P/Invoke и просто использовали код C# в качестве руководства (проверьте, какие параметры вы должны передать и как выглядит возвращаемое значение, используя этот код). Существуют также преобразователи VB.Net в C#, но я никогда ими не пользовался.   -  person Eric J.    schedule 12.11.2012
comment
- Rep меня все, но вы не помогли мне вообще на самом деле. Вы все меня еще больше запутали.   -  person Onlykl    schedule 12.11.2012
comment
Хорошо, как насчет этого: 1) узнать о P/Invoke, затем 2) узнайте о GetExtendedTcpTable, затем соедините их вместе, используя pinvoke.net, чтобы пропустить сложные части. Я не знаю, как сделать это проще, чем это. Помните, что не каждая задача так проста, как кажется.   -  person Michael Petrotta    schedule 12.11.2012


Ответы (2)


У меня недостаточно представителей, чтобы прокомментировать принятый ответ, но я бы сказал, что считаю проверку возникновения исключения довольно плохой практикой!

Я потратил довольно много времени на поиск решения очень похожей проблемы и уже собирался пойти по маршруту P/Invoke GetExtendedTcpTable, когда наткнулся на IPGlobalProperties. Я еще не проверял это должным образом, но что-то вроде этого...

Imports System.Linq
Imports System.Net
Imports System.Net.NetworkInformation
Imports System.Windows.Forms

А потом...

Dim hostname = "server1"
Dim portno = 9081
Dim ipa = Dns.GetHostAddresses(hostname)(0)
Try
  ' Get active TCP connections - the GetActiveTcpListeners is also useful if you're starting up a server...
  Dim active = IPGlobalProperties.GetIPGlobalProperties.GetActiveTcpConnections
  If (From connection In active Where connection.LocalEndPoint.Address.Equals(ipa) AndAlso connection.LocalEndPoint.Port = portno).Any Then
    ' Port is being used by an active connection
    MessageBox.Show("Port is in use!")
  Else
    ' Proceed with connection
    Using sock As New Sockets.Socket(Sockets.AddressFamily.InterNetwork, Sockets.SocketType.Stream, Sockets.ProtocolType.Tcp)
      sock.Connect(ipa, portno)
      ' Do something more interesting with the socket here...
    End Using
  End If

Catch ex As Sockets.SocketException
  MessageBox.Show(ex.Message)
End Try

Я надеюсь, что кто-то найдет это полезным быстрее, чем я!

person Grim    schedule 27.03.2014

Dim hostname As String = "server1"
Dim portno As Integer = 9081
Dim ipa As IPAddress = DirectCast(Dns.GetHostAddresses(hostname)(0), IPAddress)
Try
    Dim sock As New System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp)
    sock.Connect(ipa, portno)
    If sock.Connected = True Then
        ' Port is in use and connection is successful
        MessageBox.Show("Port is Closed")
    End If

    sock.Close()
Catch ex As System.Net.Sockets.SocketException
    If ex.ErrorCode = 10061 Then
        ' Port is unused and could not establish connection 
        MessageBox.Show("Port is Open!")
    Else
        MessageBox.Show(ex.Message)
    End If
End Try

это помогло мне :)

person Onlykl    schedule 12.11.2012