【发布时间】:2011-09-05 14:22:26
【问题描述】:
我可以掌握 TCP 与 UDP 的概念,但我仍然不知道为什么有 2 种发送 UDP 数据包的方式,并且我仍然不明白这对于bind() 和 @ 是否绝对必要987654322@...
【问题讨论】:
标签: sockets networking network-programming udp
我可以掌握 TCP 与 UDP 的概念,但我仍然不知道为什么有 2 种发送 UDP 数据包的方式,并且我仍然不明白这对于bind() 和 @ 是否绝对必要987654322@...
【问题讨论】:
标签: sockets networking network-programming udp
accept() 用于 TCP。它与UDP无关。
UDP 中的connect() 不会对另一端做任何事情,它只是让本地 API 知道您的发送对象和接收对象。
如果您还不知道这一点,或者不在乎,或者想使用同一个套接字发送到多个目的地,则不要使用connect(),而是使用sendto()。接收也是如此。
以 UDP 服务器为例。它将调用recvfrom(),,因此它将获取源地址信息,处理请求,创建响应,并通过sendto().将其发送到该地址不涉及connect(),因此无法使用send()或recv().
只需要bind()一个服务器,因为客户端需要一个固定的端口号来发送。客户端根本不需要bind():将使用系统分配的本地端口号在第一个send()/sendto()/recv()/recvfrom() 上进行自动bind()。
【讨论】:
重要的是要了解 TCP 是面向连接的,而 UDP 是无连接协议。
您通常会在 UDP 套接字上使用 sendto() 来指定目的地。同样,您通常会使用recvfrom() 来了解从哪里接收到 UDP 数据。
但是,您实际上可以在 UDP 套接字上使用 connect() 作为选项。在这种情况下,您可以在 UDP 套接字上使用send()/recv() 将数据发送到connect() 指定的地址,并仅从该地址接收数据。 (UDP 套接字上的connect() 仅设置默认对等地址,您可以根据需要多次调用UDP 套接字上的connect(),当然,UDP 套接字上的connect() 不会执行任何握手连接.)
希望这会有所帮助。
【讨论】: