私はctypesモジュールを使用してGetTcpTable2
を呼び出しています。 C++の例hereをPythonにゆっくりと変換しています。フィールドアクセス中にクラッシュしています。フィールドアクセスのctypesでPythonがクラッシュする
if __name__ == "__main__":
ptcp_table = POINTER(MIB_TCPTABLE2)()
ptcp_table = cast(create_string_buffer(sizeof(MIB_TCPTABLE2)),
POINTER(MIB_TCPTABLE2))
ip_addr = in_addr()
size = c_ulong(sizeof(MIB_TCPTABLE2))
retval = GetTcpTable2(ptcp_table, byref(size), TRUE)
if retval == ERROR_INSUFFICIENT_BUFFER:
ptcp_table = cast(create_string_buffer(size.value),
POINTER(MIB_TCPTABLE2))
if not ptcp_table:
#throw error
pass
retval = GetTcpTable2(ptcp_table, byref(size), TRUE)
if retval == NO_ERROR:
print("Entries %d" % ptcp_table[0].dwNumEntries)
for i in range(0, ptcp_table[0].dwNumEntries):
print(ptcp_table[0].table[i])
#ip_addr.S_un.S_addr = ptcp_table[0].table[i].dwLocalAddr
#ip_addr_string = inet_nota(ip_addr)
#print(ip_addr_string)
#print(string_at(ip_addr_string))
table[i]
の離れdwLocalAddr
にアクセスしようとすると、それがクラッシュ。
ptcp_table[0].table[i].dwLocalAddr
ただ印刷するとクラッシュすることはありませんptcp_table[0].table[i]
。 印刷して他のフィールドにアクセスしようとしました。 Pythonはちょうどクラッシュします。ここで
は私の構造体の定義です:GetTcpTable2
の
class MIB_TCPROW2(Structure):
_fields_ = [
("dwState", c_ulong),
("dwLocalAddr", c_ulong),
("dwLocalPort", c_ulong),
("dwRemoteAddr", c_ulong),
("dwRemotePort", c_ulong),
("dwOwningPid", c_ulong),
("dwOffloadState", c_int)
]
class MIB_TCPTABLE2(Structure):
_fields_ = [
("dwNumEntries", c_ulong),
("table", POINTER(MIB_TCPROW2))
]
定義:
GetTcpTable2 = windll.iphlpapi.GetTcpTable2
GetTcpTable2.argtypes = [POINTER(MIB_TCPTABLE2), POINTER(c_ulong), c_char]
GetTcpTable2.restype = c_ulong
私はMIB_TCPTABLE2
構造体の定義でその小さな勘を持っています。ドキュメントは、table
がMIB_TCPROW2
のサイズの配列であり、サイズがANY_SIZE
であると言います。 iphlpapi.h
ファイルをチェックした結果、ANY_SIZE
が1であることがさらに検査されます。そして、私はPOINTER(MIB_TCPROW2)
のサイズがMIB_TCPROW2
のサイズと等しくないことを知っています。
'MIB_TCPTABLE2'は可変サイズの構造体です。 'dwNumEntries'は' table'配列の実際の大きさを示します。それをPythonにどのように表現するか私は考えていません。 –
@JonathanPotterこれを指摘していただきありがとうございます。もう少し調べてみましたが、MIB_TCPTABLE2のクラスファクトリメソッドを作成して、可変長のバージョンを生成しました。 – jacob
@ J.J.Hakala私はそれをすることができる2日前に待たなければならない。 (3時間後から) – jacob