Properly document TCP state machine query methods.
This commit is contained in:
parent
f126eab193
commit
4da2598ea7
|
@ -303,6 +303,11 @@ impl<'a> TcpSocket<'a> {
|
|||
self.remote_endpoint
|
||||
}
|
||||
|
||||
/// Return the connection state, in terms of the TCP state machine.
|
||||
pub fn state(&self) -> State {
|
||||
self.state
|
||||
}
|
||||
|
||||
/// Start listening on the given endpoint.
|
||||
///
|
||||
/// This function returns an error if the socket was open; see [is_open](#method.is_open).
|
||||
|
@ -350,6 +355,8 @@ impl<'a> TcpSocket<'a> {
|
|||
}
|
||||
|
||||
/// Return whether the socket is passively listening for incoming connections.
|
||||
///
|
||||
/// In terms of the TCP state machine, the socket must be in the `LISTEN` state.
|
||||
pub fn is_listening(&self) -> bool {
|
||||
match self.state {
|
||||
State::Listen => true,
|
||||
|
@ -362,6 +369,8 @@ impl<'a> TcpSocket<'a> {
|
|||
/// This function returns true if the socket will process incoming or dispatch outgoing
|
||||
/// packets. Note that this does not mean that it is possible to send or receive data through
|
||||
/// the socket; for that, use [can_send](#method.can_send) or [can_recv](#method.can_recv).
|
||||
///
|
||||
/// In terms of the TCP state machine, the socket must be in the `CLOSED` or `TIME-WAIT` state.
|
||||
pub fn is_open(&self) -> bool {
|
||||
match self.state {
|
||||
State::Closed => false,
|
||||
|
@ -379,6 +388,9 @@ impl<'a> TcpSocket<'a> {
|
|||
///
|
||||
/// If a connection is established, [abort](#method.close) will send a reset to
|
||||
/// the remote endpoint.
|
||||
///
|
||||
/// In terms of the TCP state machine, the socket must be in the `CLOSED`, `TIME-WAIT`,
|
||||
/// or `LISTEN` state.
|
||||
pub fn is_active(&self) -> bool {
|
||||
match self.state {
|
||||
State::Closed => false,
|
||||
|
@ -394,6 +406,9 @@ impl<'a> TcpSocket<'a> {
|
|||
/// to the remote endpoint. However, it does not make any guarantees about the state
|
||||
/// of the transmit buffer, and even if it returns true, [send](#method.send) may
|
||||
/// not be able to enqueue any octets.
|
||||
///
|
||||
/// In terms of the TCP state machine, the socket must be in the `ESTABLISHED` or
|
||||
/// `CLOSE-WAIT` state.
|
||||
pub fn may_send(&self) -> bool {
|
||||
match self.state {
|
||||
State::Established => true,
|
||||
|
@ -409,6 +424,9 @@ impl<'a> TcpSocket<'a> {
|
|||
/// This function returns true if it's possible to receive data from the remote endpoint.
|
||||
/// It will return true while there is data in the receive buffer, and if there isn't,
|
||||
/// as long as the remote endpoint has not closed the connection.
|
||||
///
|
||||
/// In terms of the TCP state machine, the socket must be in the `ESTABLISHED`,
|
||||
/// `FIN-WAIT-1`, or `FIN-WAIT-2` state, or have data in the receive buffer instead.
|
||||
pub fn may_recv(&self) -> bool {
|
||||
match self.state {
|
||||
State::Established => true,
|
||||
|
@ -421,16 +439,16 @@ impl<'a> TcpSocket<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Check whether the transmit half of the full-duplex connection is open, and
|
||||
/// the transmit buffer is not full.
|
||||
/// Check whether the transmit half of the full-duplex connection is open
|
||||
/// (see [may_send](#method.may_send), and the transmit buffer is not full.
|
||||
pub fn can_send(&self) -> bool {
|
||||
if !self.may_send() { return false }
|
||||
|
||||
!self.tx_buffer.full()
|
||||
}
|
||||
|
||||
/// Check whether the receive half of the full-duplex connection buffer is open,
|
||||
/// and the receive buffer is not empty.
|
||||
/// Check whether the receive half of the full-duplex connection buffer is open
|
||||
/// (see [may_recv](#method.may_recv), and the receive buffer is not empty.
|
||||
pub fn can_recv(&self) -> bool {
|
||||
if !self.may_recv() { return false }
|
||||
|
||||
|
@ -506,13 +524,6 @@ impl<'a> TcpSocket<'a> {
|
|||
Ok(buffer.len())
|
||||
}
|
||||
|
||||
/// Return the connection state.
|
||||
///
|
||||
/// This function is provided for debugging.
|
||||
pub fn state(&self) -> State {
|
||||
self.state
|
||||
}
|
||||
|
||||
fn set_state(&mut self, state: State) {
|
||||
if self.state != state {
|
||||
if self.remote_endpoint.addr.is_unspecified() {
|
||||
|
|
Loading…
Reference in New Issue