From 9d9a09841ce2d650a41fed776916c0a11d52f92e Mon Sep 17 00:00:00 2001 From: sun5etop <146408999+sun5etop@users.noreply.github.com> Date: Sun, 31 Mar 2024 15:11:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dudp=20bind=E7=9A=84=E6=97=B6?= =?UTF-8?q?=E5=80=99=EF=BC=8C=E5=AF=B9port0=E5=A4=84=E7=90=86=E4=B8=8D?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E7=9A=84=E9=97=AE=E9=A2=98(#676)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/net/socket/inet.rs | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/kernel/src/net/socket/inet.rs b/kernel/src/net/socket/inet.rs index 28345f7ab..a835ebddc 100644 --- a/kernel/src/net/socket/inet.rs +++ b/kernel/src/net/socket/inet.rs @@ -275,7 +275,11 @@ impl UdpSocket { } fn do_bind(&self, socket: &mut udp::Socket, endpoint: Endpoint) -> Result<(), SystemError> { - if let Endpoint::Ip(Some(ip)) = endpoint { + if let Endpoint::Ip(Some(mut ip)) = endpoint { + // 端口为0则分配随机端口 + if ip.port == 0 { + ip.port = PORT_MANAGER.get_ephemeral_port(self.metadata.socket_type)?; + } // 检测端口是否已被占用 PORT_MANAGER.bind_port(self.metadata.socket_type, ip.port, self.handle.clone())?; @@ -342,25 +346,6 @@ impl Socket for UdpSocket { let socket = socket_set_guard.get_mut::(self.handle.0); // kdebug!("is open()={}", socket.is_open()); // kdebug!("socket endpoint={:?}", socket.endpoint()); - if socket.endpoint().port == 0 { - let temp_port = PORT_MANAGER.get_ephemeral_port(self.metadata.socket_type)?; - - let local_ep = match remote_endpoint.addr { - // 远程remote endpoint使用什么协议,发送的时候使用的协议是一样的吧 - // 否则就用 self.endpoint().addr.unwrap() - wire::IpAddress::Ipv4(_) => Endpoint::Ip(Some(wire::IpEndpoint::new( - wire::IpAddress::Ipv4(wire::Ipv4Address::UNSPECIFIED), - temp_port, - ))), - wire::IpAddress::Ipv6(_) => Endpoint::Ip(Some(wire::IpEndpoint::new( - wire::IpAddress::Ipv6(wire::Ipv6Address::UNSPECIFIED), - temp_port, - ))), - }; - // kdebug!("udp write: local_ep = {:?}", local_ep); - self.do_bind(socket, local_ep)?; - } - // kdebug!("is open()={}", socket.is_open()); if socket.can_send() { // kdebug!("udp write: can send"); match socket.send_slice(buf, *remote_endpoint) {