【问题标题】:How to convert port number to network byte order?如何将端口号转换为网络字节序?
【发布时间】:2013-02-15 06:54:53
【问题描述】:

我正在编写一个程序来确定 C#.Net 中端口的进程 ID。

IpHlpApi.dll 中有一个函数GetExtendedTcpTable,它返回 TcpTable。得到表格后,我正在遍历行并解析端口号。

现在为了比较端口号,我使用 IPAddress.HostToNetworkOrder 将 27144 端口号转换为网络字节顺序,并使用 Marshal.ReadInt32 与其他端口号进行比较。比较不起作用。即没有结果匹配。

如果不使用IPAddress.HostToNetworkOrder,我使用以下逻辑

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

我能够确定进程 ID,即结果匹配之一。

你能告诉我为什么IPAddress.HostToNetworkOrder 不起作用吗?

【问题讨论】:

    标签: c# .net network-programming


    【解决方案1】:

    您可能正在使用TcpRow 中的dwLocalPort/dwRemotePort 中的DWORD。 DWORD 肯定不会是 16 位的,您可能会调用 IPAddress.HostToNetworkOrder 的 32 位版本...在使用 IPAddress.HostToNetworkOrder 函数之前,您应该尝试将其转换为 Int16

    【讨论】:

    • @utopianheaven:使用Int16 返回-5527 并按原样使用值,即Int32 返回-362217472。而当我使用移位逻辑时,返回的值为60009
    • @jags:你快到了...注意-5527 + (2^16) = 60009。您需要使用 IPAddress.HostToNetworkOrder 的Int16 版本(因为UInt16 不可用),然后将它们与UInt16s 进行比较。
    • 将结果转换为UInt16 后,我得到60009。因此,Int32 的签名性质让我感到困惑。谢谢!为了我自己的学习,我会更多地研究这些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    相关资源
    最近更新 更多