Windowsで(リッスンせずに)ポートをバインドしたプロセスを特定する


12

どのプロセスがどのソケットをリッスンしているかを知りたい場合は、netstat / TCPviewを使用するとすぐに表示されます。ただし、リッスンせずにアドレスにバインドすることは可能です。これを行うと、netstat / TCPviewには表示されませんが、ソケットはブロックされます。

Pythonの例:

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

これでポートがバインドされ、2番目のインスタンスがまだ実行されている間に2番目のインスタンスで同じコードを実行しようとすると、エラーが発生します。ただし、実際にそのポートでリッスンを開始しない限り、

s.listen(1)

ポートはnetstat / TCPviewに表示されません。

問題は、 どのポートがバインドされているか(ただし、リッスンしていない)、どのポートがバインドされているかを確認することです。

この背景には、私がいることですしている持っていたバインドすることはできません1976のポートの移動範囲を、私はこれを原因かを知りたいです。その間、試行錯誤を通じて、インターネット接続の共有がこれらのポートをブロックしていると判断しましたが、この質問に対する答えにはまだ興味があります。

編集:一般的なリクエストのため、これらのポートを見つけるために使用したコードは次のとおりです。

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"

(出力をgrepにパイプし、FAILのみをフィルターすることができます)


このスクリプトを0〜65535でループし、失敗したポートをログに記録し、結果をnetstatポートと比較できます。netstatにリストされていないものは、探しているものでなければなりません。リッスンしていない限り、これらのポートの背後にあるプロセスを示すツールやテクニックは知りません。
ケダー

@Kedar:影響を受けるポートを見つけるために私がやったことです。
ヤンシェイバル

@Lizz:コードが投稿されました。
ヤンシェイバル

答えとして投稿してもらえますか?参照として持っておくと良いでしょう:)
リズ

@Lizz:質問に対する答えではありません。影響を受けるポートは表示されますが、それらが占有しているポートは表示されません。
ヤンシェイバル

回答:


1

あなたは使うべきです

DWORD GetExtendedTcpTable(PVOID pTcpTable、PDWORD pdwSize、BOOL bOrder、ULONG ulAf、TCP_TABLE_CLASS TableClass、ULONG予約済み);

TableClass値= TCP_TABLE_OWNER_PID_ALL "or" TCP_TABLE_OWNER_PID_CONNECTIONS "or" TCP_TABLE_OWNER_PID_LISTENER

pTcpTable構造体-> MIB_TCPTABLE_OWNER_PID

取得する情報に応じて

編集:

TCP_TABLE_OWNER_PID_ALLは、MIB_TCPTABLE_OWNER_PID構造体の配列であるMIB_TCPTABLE_OWNER_PID構造体を返します。各構造体dwStateMIB_TCP_STATE_CLOSED、バインドされているときにリッスンしていないときに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;

これは、バインドされてリッスンしているソケットのみをリストしますが、質問はバインドされているがリッスンしていないソケットに関するものでした。
ルークダンスタン

あなたは主張していますか?編集を参照
パット

pastebin.com/vaHMVRQRを実行すると、リッスンせずにバインドするテーブルに何も表示されません(Win7)
ルークダンスタン

関係する構造には特定のアライメントがあります。再定義しないでください。MSによって定義されているものを参照する必要があります。また、最初にMS APIをテストする場合、Pythonは適切なツールではありません。代わりにC / C ++を使用する必要があります。
パット

表示されているコードは、バインドされているが接続されていないソケットに関する情報を提供しません。netstatコマンドの最近のバージョンでは、コマンドラインパラメータ-qは今があることを示しているそれらのソケット
zentrunix

0

netstatの最近のバージョンでは、これらのソケットを表示するコマンドラインパラメーター-qがあります。

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

使用例:

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

そのような状況でソケットを取得するためのパブリックAPIはないようです。StackOverflowの私の質問をご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.