我可以掌握TCP与UDP的概念,但我仍然不知道为什么有两种方法可以发送UDP数据包,而且我仍然不明白这是否是bind()和accept所必需的( )...
答案 0 :(得分:33)
accept()
适用于TCP。它与UDP无关。
connect()
对另一端没有任何作用,它只是让本地API知道你要发送和接收的对象。
如果您还不知道,或者不关心,或想要使用同一套接字发送到多个目的地,则不使用connect()
,而是使用sendto()
而是。同样适合接收。
例如,考虑使用UDP服务器。它会调用recvfrom(),
,以便获取源地址信息,处理请求,创建响应,然后通过sendto().
No connect()
在任何地方将其发送到该地址,这样就不可能使用send()
或recv().
只需bind()
服务器,因为客户端需要一个固定的端口号才能发送到。客户端根本不需要bind()
:使用系统分配的本地端口号在第一个send()/sendto()/recv()/recvfrom()
上进行自动绑定()。
答案 1 :(得分:11)
重要的是要理解TCP是面向连接的,而UDP是一种无连接协议。
您通常会在UDP套接字上使用sendto()
来指定目标。同样,您通常会使用recvfrom()
来了解UDP数据的接收位置。
但是,您实际上可以在UDP套接字上使用connect()
作为选项。在这种情况下,您可以使用UDP套接字上的send()/recv()
将数据发送到connect()
指定的地址,并仅从该地址接收数据。 (UDP套接字上的connect()
仅设置默认对等地址,您可以根据需要多次在UDP套接字上调用connect()
,当然,UDP套接字上的connect()
也可以不执行任何连接握手。)
希望这有帮助。