1mod tcp_client_stream;
19mod tcp_stream;
20
21pub use self::tcp_client_stream::{TcpClientConnect, TcpClientStream};
22pub use self::tcp_stream::{Connect, DnsTcpStream, TcpStream};
23
24#[cfg(feature = "tokio-runtime")]
25#[doc(hidden)]
26pub mod tokio {
27 use std::io;
28 use std::net::SocketAddr;
29 use tokio::net::TcpSocket as TokioTcpSocket;
30 use tokio::net::TcpStream as TokioTcpStream;
31
32 pub async fn connect(addr: &SocketAddr) -> Result<TokioTcpStream, io::Error> {
33 connect_with_bind(addr, &None).await
34 }
35
36 pub async fn connect_with_bind(
37 addr: &SocketAddr,
38 bind_addr: &Option<SocketAddr>,
39 ) -> Result<TokioTcpStream, io::Error> {
40 let stream = match bind_addr {
41 Some(bind_addr) => {
42 let socket = match bind_addr {
43 SocketAddr::V4(_) => TokioTcpSocket::new_v4()?,
44 SocketAddr::V6(_) => TokioTcpSocket::new_v6()?,
45 };
46 socket.bind(*bind_addr)?;
47 socket.connect(*addr).await?
48 }
49 None => TokioTcpStream::connect(addr).await?,
50 };
51 stream.set_nodelay(true)?;
52 Ok(stream)
53 }
54}