/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _DECAF_NET_SOCKETOPTIONS_H_ #define _DECAF_NET_SOCKETOPTIONS_H_ #include namespace decaf { namespace net { /** * * @since 1.0 */ class DECAF_API SocketOptions { public: /** * Disable Nagle's algorithm for this connection. Written data to the network is not * buffered pending acknowledgment of previously written data. Valid for TCP sockets. */ static const int SOCKET_OPTION_TCP_NODELAY; /** * Fetch the local address binding of a socket (this option cannot be "set" only "gotten", * since sockets are bound at creation time, and so the locally bound address cannot be * changed). The default local address of a socket is INADDR_ANY, meaning any local address * on a multi-homed host. A multi-homed host can use this option to accept connections to * only one of its addresses (in the case of a ServerSocket or DatagramSocket), or to * specify its return address to the peer (for a Socket or DatagramSocket). The parameter * of this option is an InetAddress. */ static const int SOCKET_OPTION_BINDADDR; /** * Sets SO_REUSEADDR for a socket. This is used only for MulticastSockets in decaf, and it is * set by default for MulticastSockets. */ static const int SOCKET_OPTION_REUSEADDR; /** * Sets SO_BROADCAST for a socket. This option enables and disables the ability of the process * to send broadcast messages. It is supported for only datagram sockets and only on networks * that support the concept of a broadcast message (e.g. Ethernet, token ring, etc.), and it * is set by default for DatagramSockets. */ static const int SOCKET_OPTION_BROADCAST; /** * Set which outgoing interface on which to send multicast packets. Useful on hosts with * multiple network interfaces, where applications want to use other than the system default. * Takes/returns an InetAddress. * * Valid for Multicast: DatagramSocketImpl. */ static const int SOCKET_OPTION_IP_MULTICAST_IF; /** * Same as above. This option is introduced so that the behaviour with IP_MULTICAST_IF will * be kept the same as before, while this new option can support setting outgoing interfaces * with either IPv4 and IPv6 addresses. */ static const int SOCKET_OPTION_IP_MULTICAST_IF2; /** * This option enables or disables local loopback of multicast datagrams. This option is enabled * by default for Multicast Sockets. */ static const int SOCKET_OPTION_IP_MULTICAST_LOOP; /** * This option sets the type-of-service or traffic class field in the IP header for a TCP or * UDP socket. */ static const int SOCKET_OPTION_IP_TOS; /** * Specify a linger-on-close timeout. This option disables/enables immediate return from a * close() of a TCP Socket. Enabling this option with a non-zero Integer timeout means that * a close() will block pending the transmission and acknowledgment of all data written to the * peer, at which point the socket is closed gracefully. Upon reaching the linger timeout, the * socket is closed forcefully, with a TCP RST. Enabling the option with a timeout of zero * does a forceful close immediately. If the specified timeout value exceeds 65,535 it will * be reduced to 65,535. * * Valid only for TCP: SocketImpl */ static const int SOCKET_OPTION_LINGER; /** * Set a timeout on blocking Socket operations. The option must be set prior to entering a * blocking operation to take effect. */ static const int SOCKET_OPTION_TIMEOUT; /** * Set a hint the size of the underlying buffers used by the platform for outgoing network * I/O. When used in set, this is a suggestion to the kernel from the application about the * size of buffers to use for the data to be sent over the socket. When used in get, this * must return the size of the buffer actually used by the platform when sending out data * on this socket. Valid for all sockets: SocketImpl, DatagramSocketImpl */ static const int SOCKET_OPTION_SNDBUF; /** * Set a hint the size of the underlying buffers used by the platform for incoming network * I/O. When used in set, this is a suggestion to the kernel from the application about the * size of buffers to use for the data to be received over the socket. When used in get, * this must return the size of the buffer actually used by the platform when receiving in * data on this socket. Valid for all sockets: SocketImpl, DatagramSocketImpl. */ static const int SOCKET_OPTION_RCVBUF; /** * When the keepalive option is set for a TCP socket and no data has been exchanged across * the socket in either direction for 2 hours (NOTE: the actual value is implementation * dependent), TCP automatically sends a keepalive probe to the peer. This probe is a TCP * segment to which the peer must respond. One of three responses is expected: 1. The peer * responds with the expected ACK. The application is not notified (since everything is OK). * TCP will send another probe following another 2 hours of inactivity. 2. The peer responds * with an RST, which tells the local TCP that the peer host has crashed and rebooted. The * socket is closed. 3. There is no response from the peer. The socket is closed. The * purpose of this option is to detect if the peer host crashes. * * Valid only for TCP socket: SocketImpl */ static const int SOCKET_OPTION_KEEPALIVE; /** * When the OOBINLINE option is set, any TCP urgent data received on the socket will be * received through the socket input stream. When the option is disabled (which is the default) * urgent data is silently discarded. */ static const int SOCKET_OPTION_OOBINLINE; public: virtual ~SocketOptions(); }; }} #endif /* _DECAF_NET_SOCKETOPTIONS_H_ */