在 UDP 套接字上使用 sendto()/recvfrom() 而不是 connect()/send()/recv() 的目的是啥?

Posted

技术标签:

【中文标题】在 UDP 套接字上使用 sendto()/recvfrom() 而不是 connect()/send()/recv() 的目的是啥?【英文标题】: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@...

【问题讨论】:

【参考方案1】:

    accept() 用于 TCP。它与UDP无关。

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

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

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

    只需要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() 不会执行任何握手连接.)

希望这会有所帮助。

【讨论】:

以上是关于在 UDP 套接字上使用 sendto()/recvfrom() 而不是 connect()/send()/recv() 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java - UDP通过套接字发送数据..不是rec。所有数据

在 UDP 套接字上使用 write()/read()?

关于socket通信UDP协议的问题,在客户端client下创建两个套接字s、s1分别用于recvfrom()和sendto()。

2-3:套接字(Socket)编程之UDP通信,sockaddr,sockaddr_in,recvfrom,sendto

网络编程-udp

UDP----socket通信