com.barchart.udt.OptionUDT Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of Network Show documentation
Show all versions of Network Show documentation
Encrypted, high-performance, and event-driven/reactive network stack for Java 11+
/**
* Copyright (C) 2009-2013 Barchart, Inc.
*
* All rights reserved. Licensed under the OSI BSD License.
*
* http://www.opensource.org/licenses/bsd-license.php
*/
package com.barchart.udt;
import static com.barchart.udt.OptionUDT.Format.*;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.barchart.udt.util.HelpUDT;
/**
* The Enum OptionUDT.
*
* provide 2 names: 1) UDT original and 2) human-readble
*
* keep code values in sync with udt.h - UDT::UDTOpt; enum starts with index 0
*
* @see udt options
*
* UDT_MSS, // the Maximum Transfer Unit
* UDT_SNDSYN, // if sending is blocking
* UDT_RCVSYN, // if receiving is blocking
* UDT_CC, // custom congestion control algorithm
* UDT_FC, // Flight flag size (window size)
* UDT_SNDBUF, // maximum buffer in sending queue
* UDT_RCVBUF, // UDT receiving buffer size
* UDT_LINGER, // waiting for unsent data when closing
* UDP_SNDBUF, // UDP sending buffer size
* UDP_RCVBUF, // UDP receiving buffer size
* UDT_MAXMSG, // maximum datagram message size
* UDT_MSGTTL, // time-to-live of a datagram message
* UDT_RENDEZVOUS, // rendezvous connection mode
* UDT_SNDTIMEO, // send() timeout
* UDT_RCVTIMEO, // recv() timeout
* UDT_REUSEADDR, // reuse an existing port or create a new one
* UDT_MAXBW, // maximum bandwidth (bytes per second) that the connection can use
* UDT_STATE, // current socket state, see UDTSTATUS, read only
* UDT_EVENT, // current avalable events associated with the socket
* UDT_SNDDATA, // size of data in the sending buffer
* UDT_RCVDATA // size of data available for recv
*
*/
public class OptionUDT {
static {
log = LoggerFactory.getLogger(OptionUDT.class);
values = new CopyOnWriteArrayList>();
}
/** the Maximum Transfer Unit. */
public static final OptionUDT UDT_MSS = //
NEW(0, Integer.class, DECIMAL);
/** the Maximum Transfer Unit., bytes */
public static final OptionUDT Maximum_Transfer_Unit = //
NEW(0, Integer.class, DECIMAL);
/** if sending is blocking. */
public static final OptionUDT UDT_SNDSYN = //
NEW(1, Boolean.class, BOOLEAN);
/** if sending is blocking., true/false */
public static final OptionUDT Is_Send_Synchronous = //
NEW(1, Boolean.class, BOOLEAN);
/** if receiving is blocking. */
public static final OptionUDT UDT_RCVSYN = //
NEW(2, Boolean.class, BOOLEAN);
/** if receiving is blocking, true/false */
public static final OptionUDT Is_Receive_Synchronous = //
NEW(2, Boolean.class, BOOLEAN);
/** custom congestion control algorithm */
@SuppressWarnings("rawtypes")
public static final OptionUDT UDT_CC = //
NEW(3, FactoryUDT.class, DEFAULT);
/** custom congestion control algorithm, class factory */
@SuppressWarnings("rawtypes")
public static final OptionUDT Custom_Congestion_Control = //
NEW(3, FactoryUDT.class, DEFAULT);
/** Flight flag size (window size). */
public static final OptionUDT UDT_FC = //
NEW(4, Integer.class, BINARY);
/** Flight flag size (window size), bytes */
public static final OptionUDT Flight_Window_Size = //
NEW(4, Integer.class, BINARY);
/** maximum buffer in sending queue. */
public static final OptionUDT UDT_SNDBUF = //
NEW(5, Integer.class, DECIMAL);
/** maximum buffer in sending queue. */
public static final OptionUDT Protocol_Send_Buffer_Size = //
NEW(5, Integer.class, DECIMAL);
/** UDT receiving buffer size. */
public static final OptionUDT UDT_RCVBUF = //
NEW(6, Integer.class, DECIMAL);
/** UDT receiving buffer size limit, bytes */
public static final OptionUDT Protocol_Receive_Buffer_Size = //
NEW(6, Integer.class, DECIMAL);
/** waiting for unsent data when closing. */
public static final OptionUDT UDT_LINGER = //
NEW(7, LingerUDT.class, DECIMAL);
/** waiting for unsent data when closing. true/false and timeout, seconds */
public static final OptionUDT Time_To_Linger_On_Close = //
NEW(7, LingerUDT.class, DECIMAL);
/** UDP sending buffer size. */
public static final OptionUDT UDP_SNDBUF = //
NEW(8, Integer.class, DECIMAL);
/** UDP sending buffer size limit, bytes */
public static final OptionUDT System_Send_Buffer_Size = //
NEW(8, Integer.class, DECIMAL);
/** UDP receiving buffer size. */
public static final OptionUDT UDP_RCVBUF = //
NEW(9, Integer.class, DECIMAL);
/** UDP receiving buffer size limit, bytes */
public static final OptionUDT System_Receive_Buffer_Size = //
NEW(9, Integer.class, DECIMAL);
/* maximum datagram message size */
// UDT_MAXMSG(10, Integer.class, DECIMAL); no support in udt core
/* time-to-live of a datagram message */
// UDT_MSGTTL(11, Integer.class, DECIMAL); no support in udt core
/** rendezvous connection mode. */
public static final OptionUDT UDT_RENDEZVOUS = //
NEW(12, Boolean.class, BOOLEAN);
/** rendezvous connection mode, enabled/disabled */
public static final OptionUDT Is_Randezvous_Connect_Enabled = //
NEW(12, Boolean.class, BOOLEAN);
/** send() timeout. */
public static final OptionUDT UDT_SNDTIMEO = //
NEW(13, Integer.class, DECIMAL);
/** send() timeout. milliseconds */
public static final OptionUDT Send_Timeout = //
NEW(13, Integer.class, DECIMAL);
/** recv() timeout. */
public static final OptionUDT UDT_RCVTIMEO = //
NEW(14, Integer.class, DECIMAL);
/** recv() timeout. milliseconds */
public static final OptionUDT Receive_Timeout = //
NEW(14, Integer.class, DECIMAL);
/** reuse an existing port or create a one. */
public static final OptionUDT UDT_REUSEADDR = //
NEW(15, Boolean.class, BOOLEAN);
/** reuse an existing port or create a one. true/false */
public static final OptionUDT Is_Address_Reuse_Enabled = //
NEW(15, Boolean.class, BOOLEAN);
/** maximum bandwidth (bytes per second) that the connection can use. */
public static final OptionUDT UDT_MAXBW = //
NEW(16, Long.class, DECIMAL);
/** maximum bandwidth (bytes per second) that the connection can use. */
public static final OptionUDT Maximum_Bandwidth = //
NEW(16, Long.class, DECIMAL);
/** current socket state, see UDTSTATUS, read only */
public static final OptionUDT UDT_STATE = //
NEW(17, Integer.class, DECIMAL);
/** current socket status code, see {@link StatusUDT#getCode()}, read only */
public static final OptionUDT Status_Code = //
NEW(17, Integer.class, DECIMAL);
/** current available events associated with the socket */
public static final OptionUDT UDT_EVENT = //
NEW(18, Integer.class, DECIMAL);
/** current available epoll events, see {@link EpollUDT.Opt#code} */
public static final OptionUDT Epoll_Event_Mask = //
NEW(18, Integer.class, DECIMAL);
/** size of data in the sending buffer */
public static final OptionUDT UDT_SNDDATA = //
NEW(19, Integer.class, DECIMAL);
/** current consumed sending buffer utilization, read only, bytes */
public static final OptionUDT Send_Buffer_Consumed = //
NEW(19, Integer.class, DECIMAL);
/** size of data available for recv */
public static final OptionUDT UDT_RCVDATA = //
NEW(20, Integer.class, DECIMAL);
/** current available receiving buffer capacity, read only, bytes */
public static final OptionUDT Receive_Buffer_Available = //
NEW(20, Integer.class, DECIMAL);
//
protected OptionUDT(final int code, final Class klaz, final Format format) {
this.code = code;
this.type = klaz;
this.format = format;
values.add(this);
}
protected static OptionUDT NEW(final int code, final Class klaz,
final Format format) {
return new OptionUDT(code, klaz, format);
}
public static void appendSnapshot( //
final SocketUDT socketUDT, //
final StringBuilder text //
) {
text.append("\n\t");
text.append(String.format("[id: 0x%08x]", socketUDT.id()));
for (final OptionUDT> option : values) {
int optionCode = 0;
String optionName = null;
String optionValue = null;
try {
optionCode = option.code;
optionName = option.name();
optionValue = option.format.convert(//
socketUDT.getOption(option));
if (optionName.startsWith("UD")) {
continue;
}
text.append("\n\t");
text.append(optionCode);
text.append(") ");
text.append(optionName);
text.append(" = ");
text.append(optionValue);
} catch (final Exception e) {
log.error("unexpected; " + optionName, e);
}
}
}
protected static final Logger log;
protected static final List> values;
private final int code;
private final Class> type;
private final Format format;
private String name;
public int code() {
return code;
}
public Class> type() {
return type;
}
public Format format() {
return format;
}
public String name() {
if (name == null) {
name = HelpUDT.constantFieldName(getClass(), this);
}
return name;
}
/**
* render options in human format
*/
public enum Format {
DECIMAL() {
@Override
public String convert(final Object value) {
if (value instanceof Number) {
final long number = ((Number) value).longValue();
return String.format("%,d", number);
}
return "invalid format";
}
}, //
BINARY() {
@Override
public String convert(final Object value) {
if (value instanceof Number) {
final long number = ((Number) value).longValue();
return String.format("%,d (%,d K)", number, number / 1024);
}
return "invalid format";
}
}, //
BOOLEAN() {
@Override
public String convert(final Object value) {
if (value instanceof Boolean) {
final boolean bool = ((Boolean) value).booleanValue();
return String.format("%b", bool);
}
return "invalid format";
}
}, //
DEFAULT() {
@Override
public String convert(final Object value) {
return "" + value;
}
}, //
;
public abstract String convert(Object value);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy