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}