使用sendto / recvfrom而不是使用UDP套接字连接/发送/ recv的目的是什么?

时间:2011-05-31 15:21:44

标签: networking network-programming udp

我可以掌握TCP与UDP的概念,但我仍然不知道为什么有两种方法可以发送UDP数据包,而且我仍然不明白这是否是bind()和accept所必需的( )...

2 个答案:

答案 0 :(得分:33)

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

  2. UDP中的
  3. connect()对另一端没有任何作用,它只是让本地API知道你要发送和接收的对象。

  4. 如果您还不知道,或者不关心,或想要使用同一套接字发送到多个目的地,则不使用connect(),而是使用sendto()而是。同样适合接收。

    例如,考虑使用UDP服务器。它会调用recvfrom(),,以便获取源地址信息,处理请求,创建响应,然后通过sendto(). No connect()在任何地方将其发送到该地址,这样就不可能使用send()recv().

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

答案 1 :(得分:11)

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

  • TCP:在向/从远程主机发送/接收数据之前,您需要先连接。
  • UDP:无需连接。您可以向/从任何主机发送/接收数据。

您通常会在UDP套接字上使用sendto()来指定目标。同样,您通常会使用recvfrom()来了解UDP数据的接收位置。

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

希望这有帮助。