我需要确保 TCP 连接的客户端通过特定的 (IP) 接口。标准方法是将bind()套接字连接到IP:0, 之前connect()。
我开始查看tokio::net::TcpStream::connect()和朋友,似乎没有办法做到这一点。我退后一步看了看std::net::TcpStream,里面也没有。
我是否遗漏了什么,或者我需要使用一些较低级别的 API?
在 Tokio 版本 1.x 和 0.3 中,您可以通过TcpSocket类型使用其bind方法来执行此操作。
use std::io::Result;\nuse tokio::net::{TcpSocket, TcpStream};\n\nasync fn connect_bind(bind: SockAddr, connect: SockAddr) -> Result<TcpStream> {\n let socket = TcpSocket::new_v4()?;\n socket.bind(bind)?;\n\n socket.connect(connect).await\n}\nRun Code Online (Sandbox Code Playgroud)\nTokio 0.2 的旧答案
\n目前最好的方法确实是使用socket2创建套接字并将其转换为 Tokio TcpStream。为了正确处理此方法连接步骤将被阻塞的事实,您可以使用tokio::task::spawn_blocking.
use std::io::Result;\nuse tokio::net::{TcpSocket, TcpStream};\n\nasync fn connect_bind(bind: SockAddr, connect: SockAddr) -> Result<TcpStream> {\n let socket = TcpSocket::new_v4()?;\n socket.bind(bind)?;\n\n socket.connect(connect).await\n}\nRun Code Online (Sandbox Code Playgroud)\n像这样使用spawn_blocking是相当常见的 \xe2\x80\x94 这就是 Tokio 实现文件系统操作的方式。