【问题标题】:UdpClient: Specify the source port when sending a dataudpClient:发送数据时指定源端口
【发布时间】:2013-02-19 06:55:26
【问题描述】:

我正在使用UdpClient 在多播地址上发送数据。

代码如下所示:

m_udpclientSender = new UdpClient();
m_remoteEndPoint = new IPEndPoint(m_multicastAddress, m_port);
m_udpclientSender.ExclusiveAddressUse = false;
m_udpclientSender.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
m_udpclientSender.JoinMulticastGroup(m_multicastAddress, 255);
m_udpclientSender.ExclusiveAddressUse = false;
m_udpclientSender.Send(buffer, buffer.Length, m_remoteEndPoint);

它被发送到正确的端口/IP,但它是从一个随机端口发出的(这是预期的),但我需要/希望它从一个特定的端口发送(与我发送的端口相同) .

我看到了:How to specify source port of a UdpPacket?

但我不需要专门使用地址,如果我在构造函数中给出这个,我会得到一个异常(说这已经被绑定了)。

我必须放置相同的端口,因为协议定义不应多播响应。

【问题讨论】:

  • 你的 udpclient 对应的已经在指定的端口上监听了,对吧?所以它知道它必须回答哪个端口(它正在侦听的端口相同)。那么为什么要指定源端口呢?
  • mDNS 协议定义如果发送方端口不是 5353(mDNS 端口),则为单播查询。这意味着我不会在我正在收听的多播组中收到它(并且其他人也不会收到这个答案)。
  • 我同意 David Pfeffer 的观点,但在您的代码中,ExclusiveAddressUse 属性仍然存在问题。看看这个:link。可能你直接使用socket类会更好。

标签: c# .net udpclient


【解决方案1】:

您所做的一切都是正确的,但听起来该端口的其他用户已经拥有独占端口访问权限。 WinSock 不会让你从这个端口发送。

【讨论】:

    【解决方案2】:

    其实根据documentation

    必须在底层套接字绑定到客户端端口之前设置此属性。如果调用 UdpClient.UdpClient(Int32)、UdpClient.UdpClient(Int32, AddressFamily)、UdpClient.UdpClient(IPEndPoint) 或 UdpClient.UdpClient(String, Int32),则客户端端口绑定为构造函数的副作用,并且您不能随后设置 ExclusiveAddressUse 属性

    所以在设置源端口时不可能将 ExclusiveAddressUse 设置为 false。我直接用Socket

    【讨论】:

      猜你喜欢
      • 2012-01-08
      • 2023-02-08
      • 2011-11-25
      • 1970-01-01
      • 2011-12-07
      • 2018-01-27
      • 2013-02-09
      • 1970-01-01
      • 2012-02-09
      相关资源
      最近更新 更多