【问题标题】:Port selection for local IPEndPoint creation. Does port number matter?本地 IPEndPoint 创建的端口选择。端口号重要吗?
【发布时间】:2013-12-06 22:22:51
【问题描述】:

这是我第一次使用 IPEndPoint,请原谅我缺乏经验。

如果我像这样创建一个 IPEndPoint:

IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.25"), 0);

端口 0 是否可能已经在使用中,从而产生异常?这里是否有任何类型的约定用于使用哪个本地端口号?我应该只使用小于 65,536 的随机生成的数字吗?是否有最佳或最安全的方法来选择端口?是否重要?

此特定实例中的用例仅供我了解更多信息。我现在正在摆弄发送 UDP 广播 WOL 数据包,但后来我希望进入更复杂的代码。我只是想确保我了解最佳做法。

【问题讨论】:

    标签: c# .net sockets udpclient


    【解决方案1】:

    根据IANA

    端口号以多种方式分配,基于三个范围: 系统端口 (0-1023)、用户端口 (1024-49151) 和动态和/或 私有端口(49152-65535);这些范围的不同用途是 在 [RFC6335] 中描述。系统端口由 IETF 进程分配 标准跟踪协议,根据 [RFC6335]。分配用户端口 由 IANA 使用“IETF 审核”流程、“IESG 批准”流程, 或“专家审查”过程,根据 [RFC6335]。动态端口是 未分配。

    也来自 UdpClient(port) ctor MSDN 文档:

    如果你将0传递给构造函数,底层服务提供者将分配一个端口号。

    【讨论】:

    • 我了解 IANA 文档。我不明白什么时候真正重要,什么时候不重要。我的意思是,假设我选择端口 49153,但 Joe Coder 也使用 49153 编写了一些东西。如果我需要绑定到本地端点片刻以发送 UDP 数据包,如果 Joe Coder 的应用程序是已经运行?如果我的应用程序只需要不时发送 UDP 数据包,我最好选择一个介于 49152 和 65535 之间的随机生成的端口号,以便我可以使用新的端口号重试失败,而不是坚持使用静态的 49153?跨度>
    • 如果您只是发送,则不要使用接受 IPEndPoint 的 UdpClient 参与者。那只对接收有用。只需使用无参数演员或采用 AddressFamily 的演员。
    • 如果您所做的只是发送,IP 堆栈将管理您的本地端口。
    • 我最初是这样做的,但后来我发现当向 255.255.255.255 发送 WOL 数据包时,您必须单独绑定到每个适配器并发送数据包,以确保您的数据包以正确的方式发送网络。在这种情况下,当您未指定 IPEndPoint 时为您完成的自动选择是不够的,因为它可能会发送到您不关心的网络。
    • 啊,没错。好吧,在这种情况下,我不知道正确的答案。但是在需要有人发布正确答案的时候,您可以启动 2 个或更多程序副本并自己找到答案。
    【解决方案2】:

    首先,您需要检查是否干扰了任何standard windows service ports

    在这种情况下随机将是一个非常糟糕的方法,该端口可能正在被其他应用程序使用。

    但您始终可以go here 并选择未分配的内容。

    那里,IANA 说

    动态和/或专用端口是从 49152 到 65535 的端口

    【讨论】:

    • 我了解 IANA 文档。我不明白什么时候真正重要,什么时候不重要。我的意思是,假设我选择端口 49153,但 Joe Coder 也使用 49153 编写了一些东西。如果我需要绑定到本地端点片刻以发送 UDP 数据包,如果 Joe Coder 的应用程序是已经运行?如果我的应用程序只需要不时发送 UDP 数据包,我最好选择一个介于 49152 和 65535 之间的随机生成的端口号,以便我可以使用新的端口号重试失败,而不是坚持使用静态的 49153?跨度>
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多