pub struct SocketAncillary<'a> { /* private fields */ }
🔬This is a nightly-only experimental API. (
unix_socket_ancillary_data
#76915)Available on (Android or Linux) and Unix only.
Expand description
Unix 套接字辅助数据结构体。
Example
#![feature(unix_socket_ancillary_data)]
use std::os::unix::net::{UnixStream, SocketAncillary, AncillaryData};
use std::io::IoSliceMut;
fn main() -> std::io::Result<()> {
let sock = UnixStream::connect("/tmp/sock")?;
let mut fds = [0; 8];
let mut ancillary_buffer = [0; 128];
let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]);
let mut buf = [1; 8];
let mut bufs = &mut [IoSliceMut::new(&mut buf[..])][..];
sock.recv_vectored_with_ancillary(bufs, &mut ancillary)?;
for ancillary_result in ancillary.messages() {
if let AncillaryData::ScmRights(scm_rights) = ancillary_result.unwrap() {
for fd in scm_rights {
println!("receive file descriptor: {fd}");
}
}
}
Ok(())
}
RunImplementations§
source§impl<'a> SocketAncillary<'a>
impl<'a> SocketAncillary<'a>
sourcepub fn new(buffer: &'a mut [u8]) -> Self
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
pub fn new(buffer: &'a mut [u8]) -> Self
unix_socket_ancillary_data
#76915)sourcepub fn capacity(&self) -> usize
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
pub fn capacity(&self) -> usize
unix_socket_ancillary_data
#76915)返回缓冲区的容量。
sourcepub fn is_empty(&self) -> bool
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
pub fn is_empty(&self) -> bool
unix_socket_ancillary_data
#76915)如果辅助数据为空,则返回 true
。
sourcepub fn len(&self) -> usize
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
pub fn len(&self) -> usize
unix_socket_ancillary_data
#76915)返回使用的字节数。
sourcepub fn messages(&self) -> Messages<'_> ⓘ
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
pub fn messages(&self) -> Messages<'_> ⓘ
unix_socket_ancillary_data
#76915)返回控制消息的迭代器。
sourcepub fn truncated(&self) -> bool
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
pub fn truncated(&self) -> bool
unix_socket_ancillary_data
#76915)如果在 recv 操作期间辅助设备被截断,则为 true
。
Example
#![feature(unix_socket_ancillary_data)]
use std::os::unix::net::{UnixStream, SocketAncillary};
use std::io::IoSliceMut;
fn main() -> std::io::Result<()> {
let sock = UnixStream::connect("/tmp/sock")?;
let mut ancillary_buffer = [0; 128];
let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]);
let mut buf = [1; 8];
let mut bufs = &mut [IoSliceMut::new(&mut buf[..])][..];
sock.recv_vectored_with_ancillary(bufs, &mut ancillary)?;
println!("Is truncated: {}", ancillary.truncated());
Ok(())
}
Runsourcepub fn add_fds(&mut self, fds: &[RawFd]) -> bool
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
pub fn add_fds(&mut self, fds: &[RawFd]) -> bool
unix_socket_ancillary_data
#76915)将文件描述符添加到辅助数据。
如果缓冲区中有足够的空间,函数将返回 true
。
如果没有足够的空间,则不会追加文件描述符。
从技术上讲,这意味着此操作将添加级别为 SOL_SOCKET
和类型 SCM_RIGHTS
的控制消息。
Example
#![feature(unix_socket_ancillary_data)]
use std::os::unix::net::{UnixStream, SocketAncillary};
use std::os::unix::io::AsRawFd;
use std::io::IoSlice;
fn main() -> std::io::Result<()> {
let sock = UnixStream::connect("/tmp/sock")?;
let mut ancillary_buffer = [0; 128];
let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]);
ancillary.add_fds(&[sock.as_raw_fd()][..]);
let buf = [1; 8];
let mut bufs = &mut [IoSlice::new(&buf[..])][..];
sock.send_vectored_with_ancillary(bufs, &mut ancillary)?;
Ok(())
}
Runsourcepub fn add_creds(&mut self, creds: &[SocketCred]) -> bool
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
pub fn add_creds(&mut self, creds: &[SocketCred]) -> bool
unix_socket_ancillary_data
#76915)将凭证添加到辅助数据。
如果缓冲区中有足够的空间,则函数返回 true
。
如果没有足够的空间,则不会,凭据。
从技术上讲,这意味着此操作会添加一个级别为 SOL_SOCKET
且类型为 SCM_CREDENTIALS
、SCM_CREDS
或 SCM_CREDS2
的控制消息。
sourcepub fn clear(&mut self)
🔬This is a nightly-only experimental API. (unix_socket_ancillary_data
#76915)
pub fn clear(&mut self)
unix_socket_ancillary_data
#76915)清除辅助数据,删除所有值。
Example
#![feature(unix_socket_ancillary_data)]
use std::os::unix::net::{UnixStream, SocketAncillary, AncillaryData};
use std::io::IoSliceMut;
fn main() -> std::io::Result<()> {
let sock = UnixStream::connect("/tmp/sock")?;
let mut fds1 = [0; 8];
let mut fds2 = [0; 8];
let mut ancillary_buffer = [0; 128];
let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]);
let mut buf = [1; 8];
let mut bufs = &mut [IoSliceMut::new(&mut buf[..])][..];
sock.recv_vectored_with_ancillary(bufs, &mut ancillary)?;
for ancillary_result in ancillary.messages() {
if let AncillaryData::ScmRights(scm_rights) = ancillary_result.unwrap() {
for fd in scm_rights {
println!("receive file descriptor: {fd}");
}
}
}
ancillary.clear();
sock.recv_vectored_with_ancillary(bufs, &mut ancillary)?;
for ancillary_result in ancillary.messages() {
if let AncillaryData::ScmRights(scm_rights) = ancillary_result.unwrap() {
for fd in scm_rights {
println!("receive file descriptor: {fd}");
}
}
}
Ok(())
}
Run