MCPcopy Create free account
hub / github.com/bendudson/EuraliOS / open_socket

Function open_socket

tcp/src/main.rs:299–505  ·  view source on GitHub ↗

Open a socket and wait in a loop for messages on given handle

(address: IpAddress, port: u16, comm_handle: CommHandle)

Source from the content-addressed store, hash-verified

297
298/// Open a socket and wait in a loop for messages on given handle
299fn 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

Callers 1

open_pathFunction · 0.85

Calls 8

ephemeral_port_numberFunction · 0.85
receiveFunction · 0.85
sendFunction · 0.85
thread_yieldFunction · 0.85
as_sliceMethod · 0.80
microseconds_monotonicFunction · 0.50
writeMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected