From 68312d3c68b9df288589f9636417745d46520ad2 Mon Sep 17 00:00:00 2001 From: Xshine Date: Wed, 13 Sep 2023 00:26:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=80=A0=E6=88=90=20http=20s?= =?UTF-8?q?erver=20=E7=9A=84=E9=94=99=E8=AF=AF=20(#378)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修正造成 http server 的错误 --- kernel/src/net/socket.rs | 43 ++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/kernel/src/net/socket.rs b/kernel/src/net/socket.rs index c5e4951d..66bca24b 100644 --- a/kernel/src/net/socket.rs +++ b/kernel/src/net/socket.rs @@ -49,7 +49,7 @@ impl PortManager { /// @brief 自动分配一个相对应协议中未被使用的PORT,如果动态端口均已被占用,返回错误码 EADDRINUSE pub fn get_ephemeral_port(&self, socket_type: SocketType) -> Result { - // TODO selects non-conflict high port + // TODO: selects non-conflict high port static mut EPHEMERAL_PORT: u16 = 0; unsafe { @@ -74,7 +74,7 @@ impl PortManager { let listen_table_guard = match socket_type { SocketType::UdpSocket => self.udp_port_table.lock(), SocketType::TcpSocket => self.tcp_port_table.lock(), - SocketType::RawSocket => todo!(), + SocketType::RawSocket => panic!("RawSocket cann't get a port"), }; if let None = listen_table_guard.get(&port) { drop(listen_table_guard); @@ -88,7 +88,7 @@ impl PortManager { /// @brief 检测给定端口是否已被占用,如果未被占用则在 TCP/UDP 对应的表中记录 /// /// TODO: 增加支持端口复用的逻辑 - pub fn get_port( + pub fn bind_port( &self, socket_type: SocketType, port: u16, @@ -458,7 +458,7 @@ impl UdpSocket { fn do_bind(&self, socket: &mut udp::Socket, endpoint: Endpoint) -> Result<(), SystemError> { if let Endpoint::Ip(Some(ip)) = endpoint { // 检测端口是否已被占用 - PORT_MANAGER.get_port(self.metadata.socket_type, ip.port, self.handle.clone())?; + PORT_MANAGER.bind_port(self.metadata.socket_type, ip.port, self.handle.clone())?; let bind_res = if ip.addr.is_unspecified() { socket.bind(ip.port) @@ -812,6 +812,9 @@ impl Socket for TcpSocket { if let Endpoint::Ip(Some(ip)) = endpoint { let temp_port = PORT_MANAGER.get_ephemeral_port(self.metadata.socket_type)?; + // 检测端口是否被占用 + PORT_MANAGER.bind_port(self.metadata.socket_type, temp_port, self.handle.clone())?; + // kdebug!("temp_port: {}", temp_port); let iface: Arc = NET_DRIVERS.write().get(&0).unwrap().clone(); let mut inner_iface = iface.inner_iface().lock(); @@ -884,7 +887,7 @@ impl Socket for TcpSocket { } // 检测端口是否已被占用 - PORT_MANAGER.get_port(self.metadata.socket_type, ip.port, self.handle.clone())?; + PORT_MANAGER.bind_port(self.metadata.socket_type, ip.port, self.handle.clone())?; self.local_endpoint = Some(ip); self.is_listening = false; @@ -929,15 +932,25 @@ impl Socket for TcpSocket { // 之所以把old_handle存入new_socket, 是因为当前时刻,smoltcp已经把old_handle对应的socket与远程的endpoint关联起来了 // 因此需要再为当前的socket分配一个新的handle let new_handle = GlobalSocketHandle::new(sockets.add(tcp_socket)); - let old_handle = ::core::mem::replace(&mut self.handle, new_handle); + let old_handle = ::core::mem::replace(&mut self.handle, new_handle.clone()); - let metadata = SocketMetadata { - socket_type: SocketType::TcpSocket, - send_buf_size: Self::DEFAULT_RX_BUF_SIZE, - recv_buf_size: Self::DEFAULT_TX_BUF_SIZE, - metadata_buf_size: Self::DEFAULT_METADATA_BUF_SIZE, - options: self.metadata.options, - }; + // 更新端口与 handle 的绑定 + if let Some(Endpoint::Ip(Some(ip))) = self.endpoint() { + PORT_MANAGER.unbind_port(self.metadata.socket_type, ip.port)?; + PORT_MANAGER.bind_port( + self.metadata.socket_type, + ip.port, + new_handle.clone(), + )?; + } + + let metadata = SocketMetadata::new( + SocketType::TcpSocket, + Self::DEFAULT_RX_BUF_SIZE, + Self::DEFAULT_TX_BUF_SIZE, + Self::DEFAULT_METADATA_BUF_SIZE, + self.metadata.options, + ); Box::new(TcpSocket { handle: old_handle, @@ -1209,4 +1222,8 @@ impl IndexNode for SocketInode { return Ok(meta); } + + fn resize(&self, _len: usize) -> Result<(), SystemError> { + return Ok(()); + } }