Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于创建本地IPEndPoint的端口选择。端口号重要吗?_C#_.net_Sockets_Udpclient - Fatal编程技术网

C# 用于创建本地IPEndPoint的端口选择。端口号重要吗?

C# 用于创建本地IPEndPoint的端口选择。端口号重要吗?,c#,.net,sockets,udpclient,C#,.net,Sockets,Udpclient,这是我第一次使用IPEndPoint,请原谅我缺乏经验 如果我创建这样的IPEndPoint: IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.25"), 0); 端口0是否可能已在使用中,从而产生异常?这里是否有使用哪个本地端口号的约定类型?我应该使用一个随机生成的小于65536的数字吗?有没有最佳或最安全的方法来选择港口?这是否重要 这个特定实例中的用例只是为了让我了解更多。目前我正在处理发送UDP广

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

如果我创建这样的IPEndPoint:

IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.25"), 0);
端口0是否可能已在使用中,从而产生异常?这里是否有使用哪个本地端口号的约定类型?我应该使用一个随机生成的小于65536的数字吗?有没有最佳或最安全的方法来选择港口?这是否重要


这个特定实例中的用例只是为了让我了解更多。目前我正在处理发送UDP广播WOL数据包的问题,但稍后我会用到更复杂的代码。我只是想确保我了解最佳实践。

首先,您需要检查是否有任何干扰

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

但你总是可以选择一些未分配的东西

在那里,IANA说

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

端口号根据三个范围以各种方式分配: 系统端口(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?我了解IANA文档。我不明白的是什么时候它真的重要,什么时候不重要。我想说的是,假设我选择端口49153,但是Joe Coder也用49153写了一些东西。如果我需要绑定到本地端点一段时间来发送UDP数据包,如果Joe Coder的应用程序已经在运行,我会得到一个异常吗?如果我的应用程序只需要时不时地发送UDP数据包,那么我最好选择一个介于49152和65535之间的随机生成的端口号,这样我就可以用一个新的端口号重试失败,而不是坚持使用静态的49153?如果只是发送,那么不要使用带有IPEndPoint的UdpClient actor。那个只对接收有用。只需使用无参数actor或采用AddressFamily的actor。如果您所做的只是发送,IP堆栈将管理您的本地端口。我最初是这样做的,但后来我发现,当将WOL数据包发送到255.255.255.255时,您必须单独绑定到每个适配器并发送数据包,以确保您的数据包在正确的网络上发送。在这种情况下,当您不指定IPEndPoint时为您执行的自动选择是不够的,因为它可能会发送到您不关心的网络。啊,您说得对。在这种情况下,我不知道正确的答案。但是,当有人发布正确答案时,你只需启动2份或更多的程序副本,然后自己找到答案。