Open a socket and wait in a loop for messages on given handle
(address: IpAddress, port: u16, comm_handle: CommHandle)
| 297 | |
| 298 | /// Open a socket and wait in a loop for messages on given handle |
| 299 | fn open_socket(address: IpAddress, port: u16, comm_handle: CommHandle) { |
| 300 | println!("[tcp] Connecting to {} port {}", address, port); |
| 301 | |
| 302 | let tcp_rx_buffer = TcpSocketBuffer::new(vec![0; 4096]); |
| 303 | let tcp_tx_buffer = TcpSocketBuffer::new(vec![0; 4096]); |
| 304 | let tcp_socket = TcpSocket::new(tcp_rx_buffer, tcp_tx_buffer); |
| 305 | |
| 306 | let tcp_handle = { |
| 307 | let mut some_interface = INTERFACE.write(); |
| 308 | let interface = (*some_interface).as_mut().unwrap(); |
| 309 | let tcp_handle = interface.add_socket(tcp_socket); |
| 310 | |
| 311 | if let Err(e) = interface.poll(Instant::from_micros(time::microseconds_monotonic() as i64)) { |
| 312 | println!("Network error: {:?}", e); |
| 313 | } |
| 314 | |
| 315 | let (socket, cx) = interface.get_socket_and_context::<TcpSocket>(tcp_handle); |
| 316 | |
| 317 | // Random port number for the local port |
| 318 | let local_port = ephemeral_port_number(); |
| 319 | if socket.connect(cx, (address, port), local_port).is_err() { |
| 320 | println!("[tcp {}/{}] socket.connect failed", address, port); |
| 321 | interface.remove_socket(tcp_handle); |
| 322 | None |
| 323 | } else { |
| 324 | Some(tcp_handle) |
| 325 | } |
| 326 | }; |
| 327 | |
| 328 | loop { |
| 329 | match syscalls::receive(&comm_handle) { |
| 330 | Ok(syscalls::Message::Long( |
| 331 | message::WRITE, |
| 332 | MessageData::Value(length), |
| 333 | MessageData::MemoryHandle(handle))) => { |
| 334 | |
| 335 | // Get a slice |
| 336 | let mut data = handle.as_slice::<u8>(length as usize); |
| 337 | |
| 338 | // Keep trying to send the data |
| 339 | loop { |
| 340 | match tcp_handle { |
| 341 | Some(handle) => { |
| 342 | let mut some_interface = INTERFACE.write(); |
| 343 | let interface = (*some_interface).as_mut().unwrap(); |
| 344 | |
| 345 | if let Err(e) = interface.poll(Instant::from_micros(time::microseconds_monotonic() as i64)) { |
| 346 | println!("[tcp {}/{}] Network error: {:?}", address, port, e); |
| 347 | } |
| 348 | |
| 349 | let socket = interface.get_socket::<TcpSocket>(handle); |
| 350 | |
| 351 | if socket.may_send() { |
| 352 | match socket.send_slice(data) { |
| 353 | Ok(length) => { // Succeeded in sending some or all the data |
| 354 | println!("[tcp {}/{}] Sent {} bytes", address, port, length); |
| 355 | if length == data.len() { |
| 356 | // All data sent |
no test coverage detected