tcp_client/
tcp_client.rs

1//! TCP client example.
2//!
3//! This example demonstrates a SOME/IP client that sends requests
4//! to a server and receives responses.
5//!
6//! Run the server first: cargo run --example tcp_server
7//! Then run: cargo run --example tcp_client
8
9use someip_rs::transport::TcpClient;
10use someip_rs::{ClientId, MethodId, ServiceId, SomeIpMessage};
11use std::time::Duration;
12
13const SERVICE_ID: u16 = 0x1234;
14const METHOD_ECHO: u16 = 0x0001;
15const METHOD_GREET: u16 = 0x0002;
16const SERVER_ADDR: &str = "127.0.0.1:30490";
17
18fn main() -> Result<(), Box<dyn std::error::Error>> {
19    println!("Connecting to SOME/IP server at {SERVER_ADDR}...");
20
21    let mut client = TcpClient::connect(SERVER_ADDR)?;
22    client.set_client_id(ClientId(0x0100));
23    client.set_read_timeout(Some(Duration::from_secs(5)))?;
24
25    println!("Connected!");
26
27    // Example 1: Simple echo request
28    println!("\n--- Example 1: Echo Request ---");
29    let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
30        .payload(b"Hello, SOME/IP!".as_slice())
31        .build();
32
33    println!(
34        "Sending request: service={}, method={}, payload={:?}",
35        request.header.service_id,
36        request.header.method_id,
37        String::from_utf8_lossy(&request.payload)
38    );
39
40    let response = client.call(request)?;
41    println!(
42        "Received response: return_code={:?}, payload={:?}",
43        response.header.return_code,
44        String::from_utf8_lossy(&response.payload)
45    );
46
47    // Example 2: Multiple requests
48    println!("\n--- Example 2: Multiple Requests ---");
49    for i in 1..=3 {
50        let payload = format!("Message #{i}");
51        let request = SomeIpMessage::request(ServiceId(SERVICE_ID), MethodId(METHOD_GREET))
52            .payload(payload.as_bytes().to_vec())
53            .build();
54
55        println!("Request {i}: session_id={}", request.header.session_id);
56        let response = client.call(request)?;
57        println!(
58            "Response {i}: session_id={}, payload={:?}",
59            response.header.session_id,
60            String::from_utf8_lossy(&response.payload)
61        );
62    }
63
64    // Example 3: Fire-and-forget (notification)
65    println!("\n--- Example 3: Fire-and-Forget ---");
66    let notification =
67        SomeIpMessage::request_no_return(ServiceId(SERVICE_ID), MethodId(METHOD_ECHO))
68            .payload(b"This is a notification".as_slice())
69            .build();
70
71    println!("Sending notification (no response expected)...");
72    client.send(notification)?;
73    println!("Notification sent!");
74
75    println!("\nDone!");
76    Ok(())
77}