Struct std::net::TcpListener1.0.0[][src]

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(())
}
Run

Implementations

创建一个新的 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

返回此侦听器的本地套接字地址。

Examples

use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpListener};

let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
assert_eq!(listener.local_addr().unwrap(),
           SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::new(127, 0, 0, 1), 8080)));
Run

为基础套接字创建一个新的独立拥有的句柄。

返回的 TcpListener 是与此 object 引用相同的套接字的引用。 这两个句柄均可用于接受传入连接,并且在一个侦听器上设置的选项将影响另一个。

Examples

use std::net::TcpListener;

let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
let listener_clone = listener.try_clone().unwrap();
Run

接受来自此侦听器的新传入连接。

该函数将阻塞调用线程,直到建立新的 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),
}
Run

返回在此侦听器上接收到的连接上的迭代器。

返回的迭代器将永远不会返回 None,也不会产生对等方的 SocketAddr 结构体。 对其进行迭代等效于在循环中调用 TcpListener::accept

Examples

use std::net::TcpListener;

let listener = TcpListener::bind("127.0.0.1:80").unwrap();

for stream in listener.incoming() {
    match stream {
        Ok(stream) => {
            println!("new client!");
        }
        Err(e) => { /* connection failed */ }
    }
}
Run

设置此套接字上 IP_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");
Run

获取此套接字的 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);
Run
👎 Deprecated since 1.16.0:

this option can only be set before the socket is bound

👎 Deprecated since 1.16.0:

this option can only be set before the socket is bound

获取此套接字上 SO_ERROR 选项的值。

这将检索存储在基础套接字中的错误,从而清除进程中的字段。 这对于检查两次调用之间的错误很有用。

Examples

use std::net::TcpListener;

let listener = TcpListener::bind("127.0.0.1:80").unwrap();
listener.take_error().expect("No error was expected");
Run

将此 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),
    }
}
Run

Trait Implementations

This is supported on Unix only.

提取原始文件描述符。 Read more

This is supported on WASI only.
🔬 This is a nightly-only experimental API. (wasi_ext #71213)

提取原始文件描述符。 Read more

This is supported on Windows only.

从此 object 中提取基础原始套接字。

使用给定的格式化程序格式化该值。 Read more

This is supported on Unix only.

根据给定的原始文件描述符构造 Self 的新实例。 Read more

This is supported on WASI only.
🔬 This is a nightly-only experimental API. (wasi_ext #71213)

根据给定的原始文件描述符构造 Self 的新实例。 Read more

This is supported on Windows only.

从给定的原始套接字创建一个新的 I/O object。 Read more

This is supported on Unix only.

使用此 object,返回原始基础文件描述符。 Read more

This is supported on WASI only.
🔬 This is a nightly-only experimental API. (wasi_ext #71213)

使用此 object,返回原始基础文件描述符。 Read more

This is supported on Windows only.

消耗此对象,返回原始基础套接字。 Read more

Auto Trait Implementations

Blanket Implementations

获取 selfTypeIdRead more

从拥有的值中一成不变地借用。 Read more

从拥有的值中借用。 Read more

执行转换。

执行转换。

发生转换错误时返回的类型。

执行转换。

发生转换错误时返回的类型。

执行转换。