【问题标题】:What's the purpose of using sendto()/recvfrom() instead of connect()/send()/recv() with UDP sockets?在 UDP 套接字上使用 sendto()/recvfrom() 而不是 connect()/send()/recv() 的目的是什么?
【发布时间】:2011-09-05 14:22:26
【问题描述】:

我可以掌握 TCP 与 UDP 的概念,但我仍然不知道为什么有 2 种发送 UDP 数据包的方式,并且我仍然不明白这对于bind() 和 @ 是否绝对必要987654322@...

【问题讨论】:

    标签: sockets networking network-programming udp


    【解决方案1】:
    1. accept() 用于 TCP。它与UDP无关。

    2. UDP 中的connect() 不会对另一端做任何事情,它只是让本地 API 知道您的发送对象和接收对象。

    3. 如果您还不知道这一点,或者不在乎,或者想使用同一个套接字发送到多个目的地,则不要使用connect(),而是使用sendto()。接收也是如此。

      以 UDP 服务器为例。它将调用recvfrom(),,因此它将获取源地址信息,处理请求,创建响应,并通过sendto().将其发送到该地址不涉及connect(),因此无法使用send()recv().

    4. 只需要bind()一个服务器,因为客户端需要一个固定的端口号来发送。客户端根本不需要bind():将使用系统分配的本地端口号在第一个send()/sendto()/recv()/recvfrom() 上进行自动bind()。

    【讨论】:

    • listen() 怎么样?关于 bind() 方法,这是否意味着我收到了登陆该端口的所有内容?
    • @gokoon 1.listen() 用于 TCP。它与UDP无关。 2. 作为一个问题,“bind() 怎么样”到底是什么意思? 3. 是的,如果您没有连接,您会收到发往该 UDP 端口的所有内容。
    • @EJP 这个linux.die.net/man/7/udp 表示当调用connect() 时,UDP 使用读/写!那么读/写还是发送/接收?
    • @entropy 不,它没有。它说“当在套接字上调用 connect(2) 时,会设置默认目标地址,现在可以使用 send(2) 或 write(2) 发送数据报”。同样,在这种情况下,您可以使用 read()recv()
    • @EJP 如果我在第一次 sendto() 调用之前执行 bind() 函数,它是否会覆盖第一次 send() /sendto() /recv() / 完成的自动 bind() revfrom() 调用?
    【解决方案2】:

    重要的是要了解 TCP 是面向连接的,而 UDP 是无连接协议。

    • TCP:您需要先连接,然后才能向远程主机发送/接收数据。
    • UDP:不需要连接。您可以向任何主机发送/接收数据。

    您通常会在 UDP 套接字上使用 sendto() 来指定目的地。同样,您通常会使用recvfrom() 来了解从哪里接收到 UDP 数据。

    但是,您实际上可以在 UDP 套接字上使用 connect() 作为选项。在这种情况下,您可以在 UDP 套接字上使用send()/recv() 将数据发送到connect() 指定的地址,并仅从该地址接收数据。 (UDP 套接字上的connect() 仅设置默认对等地址,您可以根据需要多次调用UDP 套接字上的connect(),当然,UDP 套接字上的connect() 不会执行任何握手连接.)

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多