Menentukan proses apa yang telah mengikat port (tanpa mendengarkan) pada Windows

12

Jika saya ingin mengetahui proses apa yang sedang mendengarkan pada soket apa, saya dapat menggunakan netstat / TCPview dan akan segera melihatnya. Namun, dimungkinkan untuk mengikat ke alamat tanpa mendengarkan. Jika ini dilakukan, itu tidak muncul di netstat / TCPview, tetapi tidak memblokir soket.

Contoh python:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0',12345))

Port sekarang terikat, dan mencoba mengeksekusi kode yang sama dalam instance kedua saat yang pertama masih berjalan akan menghasilkan kesalahan. Namun, kecuali Anda benar-benar mulai mendengarkan pada port itu menggunakan

s.listen(1)

port tidak muncul di netstat / TCPview.

Pertanyaannya adalah: Apakah mungkin untuk melihat port apa yang terikat (tetapi tidak mendengarkan), dan proses mana yang mengikat mereka?

Latar belakang dari hal ini adalah bahwa saya telah memiliki rentang bergerak port 1976 yang tidak dapat terikat , dan saya ingin tahu apa yang menyebabkan ini. Sementara itu, saya memutuskan melalui trial and error bahwa Berbagi Sambungan Internet memblokir port tersebut, tetapi saya masih penasaran dengan jawaban untuk pertanyaan ini.

Sunting: Karena permintaan populer, berikut adalah kode yang saya gunakan untuk menemukan port tersebut:

import time
import socket

for i in range(0,65536):
    try:
        print "Listening on port", i, '...', 
        serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        serversocket.bind(('0.0.0.0', i))
        serversocket.listen(5)
        #time.sleep(0.1)
        serversocket.close()
        print "ok"
    except:
        print "FAIL"

(Anda mungkin ingin menyalurkan output ke grep dan filter untuk FAIL saja)

Jan Schejbal
sumber
Anda dapat mengulang skrip ini dari 0 hingga 65535, mencatat port yang gagal aktif dan membandingkan hasilnya dengan port netstat. Yang tidak terdaftar di netstat harus sesuai dengan yang Anda cari. Saya tidak tahu ada alat atau teknik yang akan menunjukkan kepada Anda apa proses di balik port-port itu, kecuali itu mendengarkan.
Kedar
@Kedar: Itulah yang saya lakukan untuk mencari tahu port mana yang terpengaruh.
Jan Schejbal
@ Lizz: Kode diposting.
Jan Schejbal
bisakah Anda mempostingnya sebagai jawabannya? akan baik untuk memiliki sebagai referensi :)
Lizz
@ Lizz: Ini bukan jawaban untuk pertanyaan itu. Ini menunjukkan port mana yang terpengaruh, tetapi bukan port yang ditempati.
Jan Schejbal

Jawaban:

1

kamu harus menggunakan

DWORD GetExtendedTcpTable (PVOID pTcpTable, PDWORD pdwSize, BOOL bOrder, ULONG ulAf, TCP_TABLE_CLASS TableClass, ULONG Reserved);

dengan

Nilai TableClass = TCP_TABLE_OWNER_PID_ALL "atau" TCP_TABLE_OWNER_PID_CONNECTIONS "atau" TCP_TABLE_OWNER_PID_LISTENER

struktur pTcpTable -> MIB_TCPTABLE_OWNER_PID

tergantung pada info yang ingin Anda ambil

EDIT:

TCP_TABLE_OWNER_PID_ALL mengembalikan struktur MIB_TCPTABLE_OWNER_PID yang merupakan susunan struktur MIB_TCPROW_OWNER_PID di mana masing dwState- masing harus memiliki MIB_TCP_STATE_CLOSEDketika terikat dan tidak mendengarkan, struktur ini juga menawarkan dwLocalAddrdandwLocalPort

typedef struct _MIB_TCPROW_OWNER_PID {
  DWORD dwState;
  DWORD dwLocalAddr;
  DWORD dwLocalPort;
  DWORD dwRemoteAddr;
  DWORD dwRemotePort;
  DWORD dwOwningPid;
} MIB_TCPROW_OWNER_PID, *PMIB_TCPROW_OWNER_PID;
Menepuk
sumber
Ini hanya mencantumkan soket yang terikat dan mendengarkan, tetapi pertanyaannya adalah soket yang terikat tetapi tidak mendengarkan.
Luke Dunstan
apakah Anda menegaskan atau bertanya ??? lihat hasil edit
Pat
Ketika saya menjalankan pastebin.com/vaHMVRQR, saya tidak mendapatkan apa-apa di tabel untuk diikat tanpa mendengarkan (Win7)
Luke Dunstan
Struktur yang terlibat memiliki keberpihakan tertentu, Anda tidak harus mendefinisikannya kembali; Anda harus referensi yang didefinisikan oleh MS. Juga jika Anda ingin menguji MS API Python awalnya bukan alat yang tepat; Anda harus menggunakan C / C ++ sebagai gantinya.
Pat
kode yang ditampilkan tidak memberikan informasi tentang soket yang terikat tetapi tidak terhubung; dalam versi terbaru dari netstat sekarang ada parameter baris perintah -q yang menunjukkan soket tersebut
zentrunix
0

Dalam versi terbaru dari netstat sekarang ada parameter baris perintah -q yang menunjukkan soket itu.

$ netstat -?

Displays protocol statistics and current TCP/IP network connections.

NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]

  -a            Displays all connections and listening ports.
  -b            Displays the executable involved in creating...
  ...
  -p proto      Shows connections for the protocol specified...
  -q            Displays all connections, listening ports, and bound
                nonlistening TCP ports. Bound nonlistening ports may or may not
                be associated with an active connection.
  -r            Displays the routing table.
  ...

Contoh penggunaan:

$ netstat -nq -p tcp

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:7              0.0.0.0:0              LISTENING
  TCP    0.0.0.0:9              0.0.0.0:0              LISTENING
  TCP    0.0.0.0:13             0.0.0.0:0              LISTENING
  ...

 TCP    192.168.122.157:50059  54.213.66.195:443      ESTABLISHED
  TCP    0.0.0.0:49676          0.0.0.0:0              BOUND
  TCP    0.0.0.0:49700          0.0.0.0:0              BOUND
  TCP    0.0.0.0:49704          0.0.0.0:0              BOUND
  TCP    0.0.0.0:49705          0.0.0.0:0              BOUND
  ...

Tampaknya tidak ada API publik untuk mendapatkan soket dalam situasi itu. Lihat pertanyaan saya di StackOverflow .

zentrunix
sumber