tcp_server/
tcp_server.rs

1//! TCP echo server example.
2//!
3//! This example demonstrates a simple SOME/IP server that echoes back
4//! any payload it receives.
5//!
6//! Run with: cargo run --example tcp_server
7//! Then connect with: cargo run --example tcp_client
8
9use someip_rs::transport::TcpServer;
10use someip_rs::{MessageType, ReturnCode, ServiceId};
11use std::thread;
12
13const SERVICE_ID: u16 = 0x1234;
14const BIND_ADDR: &str = "127.0.0.1:30490";
15
16fn main() -> Result<(), Box<dyn std::error::Error>> {
17    println!("Starting SOME/IP TCP server on {BIND_ADDR}...");
18
19    let server = TcpServer::bind(BIND_ADDR)?;
20    println!("Server listening on {}", server.local_addr());
21
22    for connection in server.incoming() {
23        match connection {
24            Ok(mut conn) => {
25                let peer = conn.peer_addr();
26                println!("New connection from {peer}");
27
28                // Handle each connection in a separate thread
29                thread::spawn(move || {
30                    loop {
31                        match conn.read_message() {
32                            Ok(request) => {
33                                println!(
34                                    "Received: service={}, method={}, type={:?}, payload={} bytes",
35                                    request.header.service_id,
36                                    request.header.method_id,
37                                    request.header.message_type,
38                                    request.payload.len()
39                                );
40
41                                // Check if it's our service
42                                if request.header.service_id != ServiceId(SERVICE_ID) {
43                                    println!("Unknown service, sending error response");
44                                    let error = request
45                                        .create_error_response(ReturnCode::UnknownService)
46                                        .build();
47                                    let _ = conn.write_message(&error);
48                                    continue;
49                                }
50
51                                // Only respond to requests (not notifications)
52                                if request.header.message_type == MessageType::Request {
53                                    // Echo back the payload
54                                    let response = request
55                                        .create_response()
56                                        .payload(request.payload.clone())
57                                        .build();
58
59                                    if let Err(e) = conn.write_message(&response) {
60                                        eprintln!("Failed to send response: {e}");
61                                        break;
62                                    }
63                                    println!("Sent response");
64                                }
65                            }
66                            Err(e) => {
67                                eprintln!("Connection error: {e}");
68                                break;
69                            }
70                        }
71                    }
72                    println!("Connection closed: {peer}");
73                });
74            }
75            Err(e) => {
76                eprintln!("Accept error: {e}");
77            }
78        }
79    }
80
81    Ok(())
82}