Struct std::os::unix::net::UnixDatagram 1.10.0[−][src]
pub struct UnixDatagram(_);
Expand description
Unix 数据报套接字。
Examples
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let socket = UnixDatagram::bind("/path/to/my/socket")?;
socket.send_to(b"hello world", "/path/to/other/socket")?;
let mut buf = [0; 100];
let (count, address) = socket.recv_from(&mut buf)?;
println!("socket {:?} sent {:?}", address, &buf[..count]);
Ok(())
}
RunImplementations
创建绑定到地址的 Unix 数据报套接字。
Examples
#![feature(unix_socket_abstract)]
use std::os::unix::net::{UnixDatagram};
fn main() -> std::io::Result<()> {
let sock1 = UnixDatagram::bind("path/to/socket")?;
let addr = sock1.local_addr()?;
let sock2 = match UnixDatagram::bind_addr(&addr) {
Ok(sock) => sock,
Err(err) => {
println!("Couldn't bind: {:?}", err);
return Err(err);
}
};
Ok(())
}
Run将套接字连接到指定的路径地址。
send
方法可用于将数据发送到指定的地址。
recv
和 recv_from
只会从该地址接收数据。
Examples
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
match sock.connect("/path/to/the/socket") {
Ok(sock) => sock,
Err(e) => {
println!("Couldn't connect: {:?}", e);
return Err(e)
}
};
Ok(())
}
Run将套接字连接到一个地址。
Examples
#![feature(unix_socket_abstract)]
use std::os::unix::net::{UnixDatagram};
fn main() -> std::io::Result<()> {
let bound = UnixDatagram::bind("/path/to/socket")?;
let addr = bound.local_addr()?;
let sock = UnixDatagram::unbound()?;
match sock.connect_addr(&addr) {
Ok(sock) => sock,
Err(e) => {
println!("Couldn't connect: {:?}", e);
return Err(e)
}
};
Ok(())
}
Run为底层套接字创建一个新的独立的拥有所有权的句柄。
返回的 UnixDatagram
是与此对象引用相同的套接字的引用。
两个句柄均可用于接受传入的连接,并且在一侧设置的选项会影响另一侧。
Examples
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::bind("/path/to/the/socket")?;
let sock_copy = sock.try_clone().expect("try_clone failed");
Ok(())
}
Run从套接字接收数据。
成功后,返回读取的字节数和数据到达的地址。
Examples
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
let mut buf = vec![0; 10];
let (size, sender) = sock.recv_from(buf.as_mut_slice())?;
println!("received {} bytes from {:?}", size, sender);
Ok(())
}
Run将套接字上的数据发送到指定的 SocketAddr。
成功时,返回写入的字节数。
Examples
#![feature(unix_socket_abstract)]
use std::os::unix::net::{UnixDatagram};
fn main() -> std::io::Result<()> {
let bound = UnixDatagram::bind("/path/to/socket")?;
let addr = bound.local_addr()?;
let sock = UnixDatagram::unbound()?;
sock.send_to_addr(b"bacon egg and cheese", &addr).expect("send_to_addr function failed");
Ok(())
}
Run将套接字上的数据发送到套接字的对等方。
可以通过 connect
方法设置对等地址,如果尚未连接套接字,则此方法将返回错误。
成功时,返回写入的字节数。
Examples
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.connect("/some/sock").expect("Couldn't connect");
sock.send(b"omelette au fromage").expect("send_to function failed");
Ok(())
}
Run设置套接字的读取超时。
如果提供的值为 None
,则 recv
和 recv_from
调用将无限期阻塞。
如果将零 Duration
传递给此方法,则返回 Err
。
Examples
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_read_timeout(Some(Duration::new(1, 0)))
.expect("set_read_timeout function failed");
Ok(())
}
Runuse std::io;
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let socket = UnixDatagram::unbound()?;
let result = socket.set_read_timeout(Some(Duration::new(0, 0)));
let err = result.unwrap_err();
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
Ok(())
}
Run设置套接字的写超时。
如果提供的值为 None
,则 send
和 send_to
调用将无限期阻塞。
如果将零 Duration
传递给此方法,则返回 Err
。
Examples
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_write_timeout(Some(Duration::new(1, 0)))
.expect("set_write_timeout function failed");
Ok(())
}
Runuse std::io;
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let socket = UnixDatagram::unbound()?;
let result = socket.set_write_timeout(Some(Duration::new(0, 0)));
let err = result.unwrap_err();
assert_eq!(err.kind(), io::ErrorKind::InvalidInput);
Ok(())
}
Run返回此套接字的读取超时。
Examples
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_read_timeout(Some(Duration::new(1, 0)))
.expect("set_read_timeout function failed");
assert_eq!(sock.read_timeout()?, Some(Duration::new(1, 0)));
Ok(())
}
Run返回此套接字的写入超时。
Examples
use std::os::unix::net::UnixDatagram;
use std::time::Duration;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_write_timeout(Some(Duration::new(1, 0)))
.expect("set_write_timeout function failed");
assert_eq!(sock.write_timeout()?, Some(Duration::new(1, 0)));
Ok(())
}
Run移动套接字以将 unix 凭据作为 SocketAncillary
中的控制消息传递。
设置套接字选项 SO_PASSCRED
。
Examples
#![feature(unix_socket_ancillary_data)]
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let sock = UnixDatagram::unbound()?;
sock.set_passcred(true).expect("set_passcred function failed");
Ok(())
}
Run获取用于在 SocketAncillary
中传递 unix 凭据的套接字的当前值。
可以通过 set_passcred
更改此值。
获取套接字选项 SO_PASSCRED
。
从套接字所连接的远程地址接收套接字上的数据,而无需从队列中删除该数据。
成功时,返回偷看的字节数。
连续调用返回相同的数据。
这是通过将 MSG_PEEK
作为标志传递给底层的 recv
系统调用来实现的。
Examples
#![feature(unix_socket_peek)]
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let socket = UnixDatagram::bind("/tmp/sock")?;
let mut buf = [0; 10];
let len = socket.peek(&mut buf).expect("peek failed");
Ok(())
}
Run在套接字上接收单个数据报消息,而无需将其从队列中删除。 成功时,返回读取的字节数和源。
必须使用足够大的有效字节数组 buf
来调用函数,以容纳消息字节。
如果消息太长而无法容纳在提供的缓冲区中,则多余的字节可能会被丢弃。
连续调用返回相同的数据。
这是通过将 MSG_PEEK
作为标志传递到底层的 recvfrom
系统调用来实现的。
不要使用此函数来实现繁忙等待,而应使用 libc::poll
来同步一个或多个套接字上的 IO 事件。
Examples
#![feature(unix_socket_peek)]
use std::os::unix::net::UnixDatagram;
fn main() -> std::io::Result<()> {
let socket = UnixDatagram::bind("/tmp/sock")?;
let mut buf = [0; 10];
let (len, addr) = socket.peek_from(&mut buf).expect("peek failed");
Ok(())
}
Run