我最近开始学习套接字使用,更具体地说是Java。
在this link中显示了一个简单的客户端 - 服务器UDP应用程序。
我的问题是:当这个调用receive的datagramsocket对象没有设置端口时,客户端如何使用receive()方法接收响应?
答案 0 :(得分:1)
客户端通过nullary构造函数初始化其DatagramSocket
,该构造函数将套接字绑定到通配符地址上的某个可用端口(以未指定的方式选择)。这与没有设置端口完全不同 - 是端口集,但它是由计算机选择的,未由程序明确指定。
当服务器收到消息时,它不仅会提取消息数据,还会提取源地址和端口。它将响应发送到该地址和端口。客户端通过与其发送原始邮件相同的套接字成功接收到它,因为它仍然绑定到同一个端口,即使您不确切知道它是哪一个。
答案 1 :(得分:0)
第一次使用该套接字发送数据包时,将分配一个临时端口。如果您需要特定端口,那么您可以显式绑定它,例如bootp所需。但是在最简单的情况下,不需要绑定,而是获得短暂的端口。
对等体将在UDP标头中看到此端口,因为它既有源端口,也有目标端口。
作为旁注,这种机制对于TCP客户端是相同的。当他们调用connect()
时,除非套接字绑定到特定端口,否则客户端内核将分配一个临时端口,并且该端口将用于连接的生命周期。
短暂的端口通常在特定的范围内,UDP和TCP有一些端口池。内核通常有一种机制,从开始时从池中取出并逐渐递增,直到达到它从头开始的结束。正在跳过仍在使用的端口。它被称为临时端口范围,它特定于操作系统。