All Downloads are FREE. Search and download functionalities are using the official Maven repository.

oshi.software.os.InternetProtocolStats Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2020-2023 The OSHI Project Contributors
 * SPDX-License-Identifier: MIT
 */
package oshi.software.os;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.List;

import oshi.annotation.concurrent.Immutable;
import oshi.annotation.concurrent.ThreadSafe;

/**
 * Includes key statistics of TCP and UDP protocols
 */
@ThreadSafe
public interface InternetProtocolStats {

    /**
     * Get the TCP stats for IPv4 connections.
     * 

* On macOS connection information requires elevated permissions. Without elevatd permissions, segment data is * estimated. * * @return a {@link TcpStats} object encapsulating the stats. */ TcpStats getTCPv4Stats(); /** * Get the TCP stats for IPv6 connections, if available. If not available separately, these may be 0 and included in * IPv4 connections. * * @return a {@link TcpStats} object encapsulating the stats. */ TcpStats getTCPv6Stats(); /** * Get the UDP stats for IPv4 datagrams. * * @return a {@link UdpStats} object encapsulating the stats. */ UdpStats getUDPv4Stats(); /** * Get the UDP stats for IPv6 datagrams, if available. If not available separately, these may be 0 and included in * IPv4 datagrams. * * @return a {@link UdpStats} object encapsulating the stats. */ UdpStats getUDPv6Stats(); /** * Gets a list of TCP and UDP connections. * * @return A list of {@link IPConnection} objects for TCP and UDP connections. */ List getConnections(); /** * Encapsulates statistics associated with a TCP connection. */ @Immutable final class TcpStats { private final long connectionsEstablished; private final long connectionsActive; private final long connectionsPassive; private final long connectionFailures; private final long connectionsReset; private final long segmentsSent; private final long segmentsReceived; private final long segmentsRetransmitted; private final long inErrors; private final long outResets; public TcpStats(long connectionsEstablished, long connectionsActive, long connectionsPassive, long connectionFailures, long connectionsReset, long segmentsSent, long segmentsReceived, long segmentsRetransmitted, long inErrors, long outResets) { this.connectionsEstablished = connectionsEstablished; this.connectionsActive = connectionsActive; this.connectionsPassive = connectionsPassive; this.connectionFailures = connectionFailures; this.connectionsReset = connectionsReset; this.segmentsSent = segmentsSent; this.segmentsReceived = segmentsReceived; this.segmentsRetransmitted = segmentsRetransmitted; this.inErrors = inErrors; this.outResets = outResets; } /** * Connections Established is the number of TCP connections for which the current state is either ESTABLISHED or * CLOSE-WAIT * * @return the connectionsEstablished */ public long getConnectionsEstablished() { return connectionsEstablished; } /** * Connections Active is the number of times TCP connections have made a direct transition to the SYN-SENT state * from the CLOSED state. In other words, it shows a number of connections which are initiated by the local * computer. The value is a cumulative total. * * @return the connectionsActive */ public long getConnectionsActive() { return connectionsActive; } /** * Connections Passive is the number of times TCP connections have made a direct transition to the SYN-RCVD * state from the LISTEN state. In other words, it shows a number of connections to the local computer, which * are initiated by remote computers. The value is a cumulative total. * * @return the connectionsPassive */ public long getConnectionsPassive() { return connectionsPassive; } /** * Connection Failures is the number of times TCP connections have made a direct transition to the CLOSED state * from the SYN-SENT state or the SYN-RCVD state, plus the number of times TCP connections have made a direct * transition to the LISTEN state from the SYN-RCVD state. * * @return the connectionFailures */ public long getConnectionFailures() { return connectionFailures; } /** * Connections Reset is the number of times TCP connections have made a direct transition to the CLOSED state * from either the ESTABLISHED state or the CLOSE-WAIT state. * * @return the connectionsReset */ public long getConnectionsReset() { return connectionsReset; } /** * Segments Sent is the number of segments sent, including those on current connections, but excluding those * containing only retransmitted bytes. * * @return the segmentsSent */ public long getSegmentsSent() { return segmentsSent; } /** * Segments Received is the number of segments received, including those received in error. This count includes * segments received on currently established connections. * * @return the segmentsReceived */ public long getSegmentsReceived() { return segmentsReceived; } /** * Segments Retransmitted is the number of segments retransmitted, that is, segments transmitted containing one * or more previously transmitted bytes. * * @return the segmentsRetransmitted */ public long getSegmentsRetransmitted() { return segmentsRetransmitted; } /** * The number of errors received. * * @return the inErrors */ public long getInErrors() { return inErrors; } /** * The number of segments transmitted with the reset flag set. * * @return the outResets */ public long getOutResets() { return outResets; } @Override public String toString() { return "TcpStats [connectionsEstablished=" + connectionsEstablished + ", connectionsActive=" + connectionsActive + ", connectionsPassive=" + connectionsPassive + ", connectionFailures=" + connectionFailures + ", connectionsReset=" + connectionsReset + ", segmentsSent=" + segmentsSent + ", segmentsReceived=" + segmentsReceived + ", segmentsRetransmitted=" + segmentsRetransmitted + ", inErrors=" + inErrors + ", outResets=" + outResets + "]"; } } /** * Encapsulates statistics associated with a UDP connection. */ @Immutable final class UdpStats { private final long datagramsSent; private final long datagramsReceived; private final long datagramsNoPort; private final long datagramsReceivedErrors; public UdpStats(long datagramsSent, long datagramsReceived, long datagramsNoPort, long datagramsReceivedErrors) { this.datagramsSent = datagramsSent; this.datagramsReceived = datagramsReceived; this.datagramsNoPort = datagramsNoPort; this.datagramsReceivedErrors = datagramsReceivedErrors; } /** * Datagrams Sent is the number of UDP datagrams sent from the entity. * * @return the datagramsSent */ public long getDatagramsSent() { return datagramsSent; } /** * Datagrams Received is the number of UDP datagrams delivered to UDP users. * * @return the datagramsReceived */ public long getDatagramsReceived() { return datagramsReceived; } /** * Datagrams No Port is the number of received UDP datagrams for which there was no application at the * destination port. * * @return the datagramsNoPort */ public long getDatagramsNoPort() { return datagramsNoPort; } /** * Datagrams Received Errors is the number of received UDP datagrams that could not be delivered for reasons * other than the lack of an application at the destination port. * * @return the datagramsReceivedErrors */ public long getDatagramsReceivedErrors() { return datagramsReceivedErrors; } @Override public String toString() { return "UdpStats [datagramsSent=" + datagramsSent + ", datagramsReceived=" + datagramsReceived + ", datagramsNoPort=" + datagramsNoPort + ", datagramsReceivedErrors=" + datagramsReceivedErrors + "]"; } } /** * The TCP connection state as described in RFC 793. */ enum TcpState { UNKNOWN, CLOSED, LISTEN, SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT_1, FIN_WAIT_2, CLOSE_WAIT, CLOSING, LAST_ACK, TIME_WAIT, NONE; } /** * Encapsulates information associated with an IP connection. */ @Immutable final class IPConnection { private final String type; private final byte[] localAddress; private final int localPort; private final byte[] foreignAddress; private final int foreignPort; private final TcpState state; private final int transmitQueue; private final int receiveQueue; private int owningProcessId; public IPConnection(String type, byte[] localAddress, int localPort, byte[] foreignAddress, int foreignPort, TcpState state, int transmitQueue, int receiveQueue, int owningProcessId) { this.type = type; this.localAddress = Arrays.copyOf(localAddress, localAddress.length); this.localPort = localPort; this.foreignAddress = Arrays.copyOf(foreignAddress, foreignAddress.length); this.foreignPort = foreignPort; this.state = state; this.transmitQueue = transmitQueue; this.receiveQueue = receiveQueue; this.owningProcessId = owningProcessId; } /** * Returns the connection protocol type, e.g., tcp4, tcp6, tcp46, udp4, udp6, udp46 * * @return The protocol type */ public String getType() { return type; } /** * Gets the local address. For IPv4 addresses this is a 4-byte array. For IPv6 addresses this is a 16-byte * array. *

* On Unix operating systems, the 16-bit value may be truncated, giving only the high order bytes. IPv6 * addresses ending in zeroes should be considered suspect. * * @return The local address, or an empty array if the listener can accept a connection on any interface. */ public byte[] getLocalAddress() { return Arrays.copyOf(localAddress, localAddress.length); } /** * Gets the local port. * * @return The local port, or 0 if unknown, or any port. */ public int getLocalPort() { return localPort; } /** * Gets the foreign/remote address. For IPv4 addresses this is a 4-byte array. For IPv6 addresses this is a * 16-byte array. *

* On Unix operating systems, this value may be truncated. IPv6 addresses ending in zeroes should be considered * suspect. * * @return The foreign/remote address, or an empty array if unknown. An empty array will also result if */ public byte[] getForeignAddress() { return Arrays.copyOf(foreignAddress, foreignAddress.length); } /** * Gets the foreign/remote port. * * @return The foreign/remote port, or 0 if unknown. */ public int getForeignPort() { return foreignPort; } /** * Gets the connection state (TCP connections only). * * @return The connection state if known or relevant, null otherwise. */ public TcpState getState() { return state; } /** * Gets the size of the transmit queue. Not available on Windows. * * @return The size of the transmit queue, or 0 if unknown. */ public int getTransmitQueue() { return transmitQueue; } /** * Gets the size of the receive queue. Not available on Windows. * * @return The size of the receive queue, or 0 if unknown. */ public int getReceiveQueue() { return receiveQueue; } /** * Gets the id of the process which holds this connection. * * @return The process id of the process which holds this connection if known, -1 otherwise. */ public int getowningProcessId() { return owningProcessId; } @Override public String toString() { String localIp = "*"; try { localIp = InetAddress.getByAddress(localAddress).toString(); } catch (UnknownHostException e) { // NOSONAR squid:S108 } String foreignIp = "*"; try { foreignIp = InetAddress.getByAddress(foreignAddress).toString(); } catch (UnknownHostException e) { // NOSONAR squid:S108 } return "IPConnection [type=" + type + ", localAddress=" + localIp + ", localPort=" + localPort + ", foreignAddress=" + foreignIp + ", foreignPort=" + foreignPort + ", state=" + state + ", transmitQueue=" + transmitQueue + ", receiveQueue=" + receiveQueue + ", owningProcessId=" + owningProcessId + "]"; } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy