Xác định quá trình nào đã ràng buộc một cổng (không nghe) trên Windows


12

Nếu tôi muốn tìm hiểu quá trình đang lắng nghe trên socket nào, tôi có thể sử dụng netstat / TCPview và sẽ thấy ngay lập tức. Tuy nhiên, có thể liên kết với một địa chỉ mà không cần nghe. Nếu điều này được thực hiện, nó không hiển thị trong netstat / TCPview, nhưng sẽ chặn ổ cắm.

Ví dụ về Python:

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

Cổng hiện bị ràng buộc và cố gắng thực thi cùng một mã trong trường hợp thứ hai trong khi cổng đầu tiên vẫn đang chạy sẽ dẫn đến lỗi. Tuy nhiên, trừ khi bạn thực sự bắt đầu nghe trên cổng đó bằng cách sử dụng

s.listen(1)

cổng không hiển thị trong netstat / TCPview.

Câu hỏi là: Có thể xem cổng nào bị ràng buộc (nhưng không lắng nghe) và quá trình nào đang ràng buộc chúng?

Bối cảnh của điều này là tôi đã có một phạm vi di chuyển gồm 1976 cổng không thể bị ràng buộc và tôi muốn biết nguyên nhân gây ra điều này. Trong khi đó, tôi đã xác định thông qua bản dùng thử và lỗi rằng Chia sẻ kết nối Internet đang chặn các cổng đó, nhưng tôi vẫn tò mò về câu trả lời cho câu hỏi này.

Chỉnh sửa: Do yêu cầu phổ biến, đây là mã tôi đã sử dụng để tìm các cổng đó:

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"

(bạn có thể muốn chuyển đầu ra sang grep và chỉ lọc FAIL)


Bạn có thể lặp tập lệnh này từ 0 đến 65535, ghi nhật ký các cổng bị lỗi và so sánh kết quả với các cổng netstat. Những cái không được liệt kê trong netstat nên là những gì bạn đang tìm kiếm. Tôi không biết bất kỳ công cụ hoặc kỹ thuật nào sẽ cho bạn thấy quá trình đằng sau các cổng đó, trừ khi nó đang lắng nghe.
Kedar

@Kedar: Đó chính xác là những gì tôi đã làm để tìm ra cổng nào bị ảnh hưởng.
Jan Schejbal

@Lizz: Mã đã đăng.
Jan Schejbal

bạn có thể gửi nó như là câu trả lời? sẽ rất tốt nếu có tài liệu tham khảo :)
Lizz

@Lizz: Nó không phải là một câu trả lời cho câu hỏi. Nó cho thấy cổng nào bị ảnh hưởng, nhưng không phải cái gì đang chiếm giữ chúng.
Jan Schejbal

Câu trả lời:


1

bạn nên sử dụng

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

với

Giá trị bảng = TCP_TABLE_OWNER_PID_ALL "hoặc" TCP_TABLE_OWNER_PID_CONNECTIONS "hoặc" TCP_TABLE_OWNER_PID_LISTENER

Cấu trúc pTcpTable -> MIB_TCPTABLE_OWNER_PID

tùy thuộc vào thông tin bạn muốn lấy

BIÊN TẬP:

TCP_TABLE_OWNER_PID_ALL trả về cấu trúc MIB_TCPTABLE_OWNER_PID là một mảng các cấu trúc MIB_TCPROW_OWNER_PID nơi mỗi cấu trúc dwStatenên có MIB_TCP_STATE_CLOSEDkhi bị ràng buộc và không lắng nghe, cấu trúc này cũng cung cấp dwLocalAddrdwLocalPort

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;

Điều này chỉ liệt kê các ổ cắm bị ràng buộc và lắng nghe, nhưng câu hỏi cụ thể là về các ổ cắm bị ràng buộc nhưng không lắng nghe.
Luke Dunstan

bạn đang khẳng định hay hỏi ??? xem bản chỉnh sửa
Pat

Khi tôi chạy pastebin.com/vaHMVRQR, tôi không nhận được gì trong bảng để liên kết mà không lắng nghe (Win7)
Luke Dunstan

Các cấu trúc liên quan có sự sắp xếp cụ thể, bạn không nên định nghĩa lại chúng; bạn nên tham khảo những cái được xác định bởi MS. Ngoài ra nếu ban đầu bạn muốn kiểm tra MS API thì Python không phải là công cụ phù hợp; bạn nên sử dụng C / C ++ thay thế.
Pat

mã như được hiển thị không cung cấp thông tin về các ổ cắm bị ràng buộc nhưng không được kết nối; trong các phiên bản gần đây của netstat hiện có tham số dòng lệnh -q hiển thị các ổ cắm đó
zentrunix

0

Trong các phiên bản gần đây của netstat hiện có tham số dòng lệnh -q hiển thị các ổ cắm đó.

$ 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.
  ...

Ví dụ sử dụng:

$ 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
  ...

Có vẻ như không có API công khai nào để có được các socket trong tình huống đó. Xem câu hỏi của tôi trong StackOverflow .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.