pub struct ClientConn {
pub conn_id: u64,
pub state: ConnState,
pub aes_key: [u8; 16],
pub aes_encrypt_enabled: bool,
pub proto_fmt_type: ProtoFmtType,
pub last_keepalive: Instant,
pub keepalive_count: AtomicU32,
pub tx: Sender<FutuFrame>,
pub key_id: Option<String>,
pub scopes: HashSet<Scope>,
}Expand description
单个客户端连接
Fields§
§conn_id: u64§state: ConnState§aes_key: [u8; 16]§aes_encrypt_enabled: boolAES 加解密已启用(InitConnect 完成且配置了 RSA 时为 true)
proto_fmt_type: ProtoFmtType§last_keepalive: Instant§keepalive_count: AtomicU32§tx: Sender<FutuFrame>发送帧到此连接
key_id: Option<String>该连接绑定的 API key id;WS 握手时填,未配 keys.json 时为 None
scopes: HashSet<Scope>该连接持有的 scope 集合;空集 = legacy 模式 / TCP 直连,scope 检查放行
Implementations§
Source§impl ClientConn
impl ClientConn
Sourcepub fn generate_conn_id() -> u64
pub fn generate_conn_id() -> u64
生成随机连接 ID(与 C++ 的 GetRand_MilliTimeAndU22 对应)
Sourcepub fn generate_aes_key() -> [u8; 16]
pub fn generate_aes_key() -> [u8; 16]
生成随机 AES key(16 字节 hex 字符串的 ASCII 字节)
Sourcepub fn make_frame(
&self,
proto_id: u32,
serial_no: u32,
body: Bytes,
) -> FutuFrame
pub fn make_frame( &self, proto_id: u32, serial_no: u32, body: Bytes, ) -> FutuFrame
创建发送帧,自动处理 AES 加密
当 aes_encrypt_enabled 为 true 时:
- SHA1 基于明文计算(FutuFrame::new 自动处理)
- body 使用 AES-128 ECB 加密
- header.body_len 更新为密文长度
对应 C++ APIServerCS_Conn::OnSendPacketData 的加密逻辑
Sourcepub fn decrypt_body(&self, body: &[u8]) -> Result<Vec<u8>, FutuError>
pub fn decrypt_body(&self, body: &[u8]) -> Result<Vec<u8>, FutuError>
解密请求 body(如果启用了 AES 加密)
对应 C++ APIServerCS_Conn::OnRecvPacket 的解密逻辑
Sourcepub fn handle_init_connect(
&mut self,
body: &[u8],
server_ver: i32,
login_user_id: u64,
keepalive_interval: i32,
rsa_private_key: Option<&str>,
) -> Result<Vec<u8>, FutuError>
pub fn handle_init_connect( &mut self, body: &[u8], server_ver: i32, login_user_id: u64, keepalive_interval: i32, rsa_private_key: Option<&str>, ) -> Result<Vec<u8>, FutuError>
处理 InitConnect 请求,返回 InitConnect 响应 body
当配置了 RSA 私钥时:
- C2S 请求 body 使用 RSA 公钥加密(需要用私钥解密)
- S2C 响应 body 使用 RSA 公钥加密(客户端用私钥解密)
对应 C++ APIServer::OnRecvInitConnect
Auto Trait Implementations§
impl !Freeze for ClientConn
impl RefUnwindSafe for ClientConn
impl Send for ClientConn
impl Sync for ClientConn
impl Unpin for ClientConn
impl UnwindSafe for ClientConn
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more