在 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。所有数据
关于socket通信UDP协议的问题,在客户端client下创建两个套接字s、s1分别用于recvfrom()和sendto()。
2-3:套接字(Socket)编程之UDP通信,sockaddr,sockaddr_in,recvfrom,sendto