2013-02-15 178 views
0

我正在編寫一個程序,它將確定C#.Net中端口的進程ID。如何將端口號轉換爲網絡字節順序?

有一個函數GetExtendedTcpTableIpHlpApi.dll它返回TcpTable。獲取表後,我遍歷行並解析端口號。

現在爲比較端口號,我使用IPAddress.HostToNetworkOrder將27144端口號轉換爲網絡字節順序,並使用Marshal.ReadInt32與其他端口號進行比較。比較不起作用。即沒有結果匹配。

如果代替使用IPAddress.HostToNetworkOrder,我使用下面的邏輯

((27144 & 0xFF) << 8) + ((27144 & 0xFF00) >> 8) == Marshal.ReadInt32(portAddress) 

我能夠確定進程id即結果匹配的一個。

你能告訴我爲什麼IPAddress.HostToNetworkOrder不工作?

回答

2

您可能正在使用來自dwLocalPort/dwRemotePortDWORDTcpRow中。 DWORD當然不會是16位的,你可能會調用32位版本的IPAddress.HostToNetworkOrder ......在使用IPAddress.HostToNetworkOrder函數之前,你應該嘗試使用它作爲Int16

+0

僅供參考:http://msdn.microsoft.com/en-us/library/aa329627%28v=vs.71%29.aspx – alk 2013-02-15 07:32:32

+0

@utopianheaven:使用'Int16'返回'-5527'並使用該值就像'Int32'返回'-362217472'。而當我使用移位邏輯時,返回的值是'60009'。 – jags 2013-02-15 08:23:20

+1

@jags:你快到了......注意到「-5527 +(2^16)= 60009」。您需要使用IPAddress.HostToNetworkOrder的Int16版本(因爲「UInt16」不可用),但是將它們作爲UInt16進行比較。 – utopianheaven 2013-02-15 19:08:43