#ifndef OMNISOCKET_PY_CLIENT_H #define OMNISOCKET_PY_CLIENT_H #include "peer_kcp_client.h" #include "peer_udp_client.h" typedef struct omnisocket_session_stats { uint64_t send_calls; uint64_t send_bytes; uint64_t send_errors; uint64_t recv_calls; uint64_t recv_bytes; uint64_t recv_timeouts; uint64_t recv_errors; int connected; } omnisocket_session_stats_t; typedef struct omnisocket_session_kcp_stats { int connected; uint32_t conv; uint32_t rto_ms; int32_t srtt_ms; int32_t srttvar_ms; uint32_t snd_wnd; uint32_t rmt_wnd; uint32_t inflight; uint32_t window_limit; double window_pressure_pct; uint32_t snd_queue; uint32_t rcv_queue; uint32_t snd_buffer; uint64_t out_segs_total; uint64_t retrans_total; uint64_t fast_retrans_total; uint64_t lost_total; uint64_t repeat_total; uint32_t xmit_total; } omnisocket_session_kcp_stats_t; typedef struct omnisocket_session { pthread_mutex_t mutex; pthread_cond_t idle_cond; kcp_client_t *client; size_t active_ops; int closing; omnisocket_session_stats_t stats; } omnisocket_session_t; typedef struct omnisocket_udp_session { pthread_mutex_t mutex; pthread_cond_t idle_cond; udp_client_t *client; size_t active_ops; int closing; omnisocket_session_stats_t stats; } omnisocket_udp_session_t; int omnisocket_session_init(omnisocket_session_t *session); void omnisocket_session_destroy(omnisocket_session_t *session); int omnisocket_session_connect( omnisocket_session_t *session, const char *server_addr, const char *relay_via, const char *peer_id, const char *bind_ip, const char *bind_device, const kcp_conn_options_t *options, int stats_interval_ms ); int omnisocket_session_close(omnisocket_session_t *session); int omnisocket_session_send(omnisocket_session_t *session, const char *to, const void *data, size_t data_len); int omnisocket_session_recv(omnisocket_session_t *session, message_t *out_msg, int timeout_ms); int omnisocket_session_recv_into( omnisocket_session_t *session, void *buffer, size_t buffer_len, kcp_client_recv_meta_t *out_meta, int timeout_ms ); void omnisocket_session_stats_snapshot(omnisocket_session_t *session, omnisocket_session_stats_t *out_stats); void omnisocket_session_kcp_stats_snapshot(omnisocket_session_t *session, omnisocket_session_kcp_stats_t *out_stats); int omnisocket_udp_session_init(omnisocket_udp_session_t *session); void omnisocket_udp_session_destroy(omnisocket_udp_session_t *session); int omnisocket_udp_session_connect( omnisocket_udp_session_t *session, const char *server_addr, const char *peer_id, const char *bind_ip, const char *bind_device, int enable_timestamping ); int omnisocket_udp_session_close(omnisocket_udp_session_t *session); int omnisocket_udp_session_send(omnisocket_udp_session_t *session, const char *to, const void *data, size_t data_len); int omnisocket_udp_session_recv(omnisocket_udp_session_t *session, message_t *out_msg, int timeout_ms); int omnisocket_udp_session_recv_into( omnisocket_udp_session_t *session, void *buffer, size_t buffer_len, udp_client_recv_meta_t *out_meta, int timeout_ms ); void omnisocket_udp_session_stats_snapshot(omnisocket_udp_session_t *session, omnisocket_session_stats_t *out_stats); #endif