Struct std::net::TcpListener
1.0.0 · source · pub struct TcpListener(_);
Expand description
TCP 套接字服务器,侦听连接。
通过将 TcpListener
绑定到套接字地址来创建 TcpListener
之后,它会侦听传入的 TCP 连接。
可以通过调用 accept
或在 incoming
返回的 Incoming
迭代器上进行迭代来接受它们。
丢弃该值时,套接字将关闭。
传输控制协议在 IETF RFC 793 中指定。
Examples
use std::net::{TcpListener, TcpStream};
fn handle_client(stream: TcpStream) {
// ...
}
fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:80")?;
// 接受连接并顺序处理它们
for stream in listener.incoming() {
handle_client(stream?);
}
Ok(())
}
RunImplementations§
source§impl TcpListener
impl TcpListener
sourcepub fn bind<A: ToSocketAddrs>(addr: A) -> Result<TcpListener>
pub fn bind<A: ToSocketAddrs>(addr: A) -> Result<TcpListener>
创建一个新的 TcpListener
,它将绑定到指定的地址。
返回的侦听器已准备好接受连接。
端口号为 0 的绑定将要求 OS 为该侦听器分配端口。
可以通过 TcpListener::local_addr
方法查询分配的端口。
地址类型可以是 ToSocketAddrs
trait 的任何实现者。有关具体的例子,请参见其文档。
如果 addr
产生多个地址,则将对每个地址尝试 bind
,直到一个成功并返回侦听器为止。
如果没有一个地址成功创建侦听器,则返回从上次尝试 (最后一个地址) 返回的错误。
Examples
创建绑定到 127.0.0.1:80
的 TCP 侦听器:
use std::net::TcpListener;
let listener = TcpListener::bind("127.0.0.1:80").unwrap();
Run创建绑定到 127.0.0.1:80
的 TCP 侦听器。如果失败,请创建绑定到 127.0.0.1:443
的 TCP 侦听器:
use std::net::{SocketAddr, TcpListener};
let addrs = [
SocketAddr::from(([127, 0, 0, 1], 80)),
SocketAddr::from(([127, 0, 0, 1], 443)),
];
let listener = TcpListener::bind(&addrs[..]).unwrap();
Run创建绑定到操作系统在 127.0.0.1
分配的端口的 TCP 侦听器。
use std::net::TcpListener;
let socket = TcpListener::bind("127.0.0.1:0").unwrap();
Runsourcepub fn local_addr(&self) -> Result<SocketAddr>
pub fn local_addr(&self) -> Result<SocketAddr>
sourcepub fn try_clone(&self) -> Result<TcpListener>
pub fn try_clone(&self) -> Result<TcpListener>
为底层套接字创建一个新的独立的拥有所有权的句柄。
返回的 TcpListener
是与此对象引用相同的套接字的引用。
这两个句柄均可用于接受传入连接,并且在一个侦听器上设置的选项将影响另一个。
Examples
use std::net::TcpListener;
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
let listener_clone = listener.try_clone().unwrap();
Runsourcepub fn accept(&self) -> Result<(TcpStream, SocketAddr)>
pub fn accept(&self) -> Result<(TcpStream, SocketAddr)>
接受来自此侦听器的新传入连接。
该函数将阻塞调用线程,直到建立新的 TCP 连接为止。
建立后,将返回相应的 TcpStream
和远程对等方的地址。
Examples
use std::net::TcpListener;
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
match listener.accept() {
Ok((_socket, addr)) => println!("new client: {addr:?}"),
Err(e) => println!("couldn't get client: {e:?}"),
}
Runsourcepub fn incoming(&self) -> Incoming<'_> ⓘ
pub fn incoming(&self) -> Incoming<'_> ⓘ
返回在此侦听器上接收到的连接上的迭代器。
返回的迭代器将永远不会返回 None
,也不会产生对等方的 SocketAddr
结构体。
对其进行迭代等效于在循环中调用 TcpListener::accept
。
Examples
use std::net::{TcpListener, TcpStream};
fn handle_connection(stream: TcpStream) {
// ...
}
fn main() -> std::io::Result<()> {
let listener = TcpListener::bind("127.0.0.1:80")?;
for stream in listener.incoming() {
match stream {
Ok(stream) => {
handle_connection(stream);
}
Err(e) => { /* connection failed */ }
}
}
Ok(())
}
Runsourcepub fn into_incoming(self) -> IntoIncoming ⓘ
🔬This is a nightly-only experimental API. (tcplistener_into_incoming
#88339)
pub fn into_incoming(self) -> IntoIncoming ⓘ
tcplistener_into_incoming
#88339)在此侦听器上接收到的连接上将其转换为迭代器。
返回的迭代器将永远不会返回 None
,也不会产生对等方的 SocketAddr
结构体。
对其进行迭代等效于在循环中调用 TcpListener::accept
。
Examples
#![feature(tcplistener_into_incoming)]
use std::net::{TcpListener, TcpStream};
fn listen_on(port: u16) -> impl Iterator<Item = TcpStream> {
let listener = TcpListener::bind(("127.0.0.1", port)).unwrap();
listener.into_incoming()
.filter_map(Result::ok) /* Ignore failed connections */
}
fn main() -> std::io::Result<()> {
for stream in listen_on(80) {
/* handle the connection here */
}
Ok(())
}
Run1.9.0 · sourcepub fn ttl(&self) -> Result<u32>
pub fn ttl(&self) -> Result<u32>
获取此套接字的 IP_TTL
选项的值。
有关此选项的更多信息,请参见 TcpListener::set_ttl
。
Examples
use std::net::TcpListener;
let listener = TcpListener::bind("127.0.0.1:80").unwrap();
listener.set_ttl(100).expect("could not set TTL");
assert_eq!(listener.ttl().unwrap_or(0), 100);
Runpub fn set_only_v6(&self, only_v6: bool) -> Result<()>
pub fn only_v6(&self) -> Result<bool>
1.9.0 · sourcepub fn take_error(&self) -> Result<Option<Error>>
pub fn take_error(&self) -> Result<Option<Error>>
1.9.0 · sourcepub fn set_nonblocking(&self, nonblocking: bool) -> Result<()>
pub fn set_nonblocking(&self, nonblocking: bool) -> Result<()>
将此 TCP 流移入或移出非阻塞模式。
这将导致 accept
操作变为非阻塞,即立即从其调用中返回。
如果 IO 操作成功,则返回 Ok
,并且不需要进一步的操作。
如果 IO 操作无法完成,需要重试,则返回类型为 io::ErrorKind::WouldBlock
的错误。
在 Unix 平台上,调用此方法相当于调用 fcntl
FIONBIO
。
在 Windows 上,调用此方法对应于调用 ioctlsocket
FIONBIO
。
Examples
将 TCP 侦听器绑定到地址,侦听连接,并以非阻塞模式读取字节:
use std::io;
use std::net::TcpListener;
let listener = TcpListener::bind("127.0.0.1:7878").unwrap();
listener.set_nonblocking(true).expect("Cannot set non-blocking");
for stream in listener.incoming() {
match stream {
Ok(s) => {
// 用 TcpStream 做某事
handle_connection(s);
}
Err(ref e) if e.kind() == io::ErrorKind::WouldBlock => {
// 等待网络套接字就绪,通常通过平台特定的 API (例如 epoll 或 IOCP) 实现
wait_for_fd();
continue;
}
Err(e) => panic!("encountered IO error: {e}"),
}
}
RunTrait Implementations§
1.63.0 · source§impl AsFd for TcpListener
impl AsFd for TcpListener
source§fn as_fd(&self) -> BorrowedFd<'_>
fn as_fd(&self) -> BorrowedFd<'_>
source§impl AsRawSocket for TcpListener
Available on Windows only.
impl AsRawSocket for TcpListener
source§fn as_raw_socket(&self) -> RawSocket
fn as_raw_socket(&self) -> RawSocket
1.63.0 · source§impl AsSocket for TcpListener
Available on Windows only.
impl AsSocket for TcpListener
source§fn as_socket(&self) -> BorrowedSocket<'_>
fn as_socket(&self) -> BorrowedSocket<'_>
source§impl Debug for TcpListener
impl Debug for TcpListener
1.63.0 · source§impl From<OwnedFd> for TcpListener
impl From<OwnedFd> for TcpListener
1.63.0 · source§impl From<OwnedSocket> for TcpListener
Available on Windows only.
impl From<OwnedSocket> for TcpListener
source§fn from(owned: OwnedSocket) -> Self
fn from(owned: OwnedSocket) -> Self
1.63.0 · source§impl From<TcpListener> for OwnedFd
impl From<TcpListener> for OwnedFd
source§fn from(tcp_listener: TcpListener) -> OwnedFd
fn from(tcp_listener: TcpListener) -> OwnedFd
1.63.0 · source§impl From<TcpListener> for OwnedSocket
Available on Windows only.
impl From<TcpListener> for OwnedSocket
source§fn from(tcp_listener: TcpListener) -> OwnedSocket
fn from(tcp_listener: TcpListener) -> OwnedSocket
1.1.0 · source§impl FromRawFd for TcpListener
impl FromRawFd for TcpListener
source§unsafe fn from_raw_fd(fd: RawFd) -> TcpListener
unsafe fn from_raw_fd(fd: RawFd) -> TcpListener
Self
的新实例。 Read more