【问题标题】:General sockets UDP programming question一般sockets UDP编程问题
【发布时间】:2009-11-20 12:13:59
【问题描述】:

我有一个 FPGA 设备,我的代码需要与之通信。协议如下:

我发送一个非零字节 (UDP) 来开启一项功能。然后 FPGA 板开始在我发送数据的端口上喷出数据。

你看到我的困境了吗?我知道我将消息发送到哪个端口,但我不知道我从哪个端口发送(是这个端口通常不是由操作系统自动选择的?)。

我应该做的最好的猜测是创建一个带有目标 IP 和端口号的套接字,然后重用该套接字进行接收。如果这样做,它是否已经设置为侦听我发送原始消息的端口?

此外,为了您的信息,此代码的变体将使用 Python 和 C# 编写。我可以查找特定的 API,因为它们都遵循 BSD 套接字模型。

【问题讨论】:

  • 我在一本书中找到了一些很好的信息,为我解决了这个问题。如果我能再次找到该段落,我会将其添加为评论。基本上它证实了我的怀疑。 1) 您不能指定要发送的端口 from。 2)使用UDP时无需绑定。使用 sendto() 后,套接字可以重用以在发送第一个请求的端口 from 上接收数据。在我阅读的多个文档中,这种行为并不明显,这对我来说似乎很奇怪。我看看能不能找到那个参考资料。

标签: sockets udp bsd


【解决方案1】:

这正是connect(2)getsockname(2) 的用途。作为连接 UDP 套接字的奖励,您不必在每次发送时指定目标地址/端口,您将能够发现不可用的目标端口(来自目标的 ICMP 回复将在下一次发送时显示为错误,而不是丢弃),并且您的操作系统不必在每次发送时隐式连接和断开 UDP 套接字,从而节省一些周期。

【讨论】:

  • 这是对的。你不需要bind()——操作系统给你的随机端口就可以了(不,你不需要做任何特别的事情来允许UDP套接字监听传入的数据包)。 connecting 这是个好主意。
【解决方案2】:

你可以bind一个socket到一个特定的端口,检查man bind

【讨论】:

    【解决方案3】:

    您可以通过bind 套接字来获取所需的端口。

    这样做的唯一问题是您将无法在计算机上一次运行多个程序实例。

    【讨论】:

    • 好吧,你总是可以绑定到另一个端口。重要的是您要跟踪实际绑定的端口。
    • @futurelite7:是的,如果使用的是定义的端口,我的评论。一如既往。
    【解决方案4】:

    您正在使用 UDP 发送/接收数据。只需创建一个新的 UDP 套接字并绑定到您想要的接口/端口。然后指示您的 FPGA 程序将 UDP 数据包发送回您绑定的端口。 UDP 不需要您侦听/设置连接。 (仅 TCP 需要)

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2018-05-06
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多