Files

158 lines
5.8 KiB
C
Raw Permalink Normal View History

#pragma once
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
#include <aws/crt/Exports.h>
#include <aws/io/socket.h>
namespace Aws
{
namespace Crt
{
namespace Io
{
enum class SocketType
{
/**
* A streaming socket sends reliable messages over a two-way connection.
* This means TCP when used with IPV4/6, and Unix domain sockets, when used with
* AWS_SOCKET_LOCAL
*/
Stream = AWS_SOCKET_STREAM,
/**
* A datagram socket is connectionless and sends unreliable messages.
* This means UDP when used with IPV4/6.
* LOCAL sockets are not compatible with DGRAM.
*/
Dgram = AWS_SOCKET_DGRAM,
};
enum class SocketDomain
{
IPv4 = AWS_SOCKET_IPV4,
IPv6 = AWS_SOCKET_IPV6,
/**
* Unix domain sockets (or at least something like them)
*/
Local = AWS_SOCKET_LOCAL,
};
/**
* Socket configuration options
*/
class AWS_CRT_CPP_API SocketOptions
{
public:
SocketOptions();
SocketOptions(const SocketOptions &rhs) = default;
SocketOptions(SocketOptions &&rhs) = default;
SocketOptions &operator=(const SocketOptions &rhs) = default;
SocketOptions &operator=(SocketOptions &&rhs) = default;
/**
* Set socket type
* @param type: SocketType object.
*/
void SetSocketType(SocketType type) { options.type = (enum aws_socket_type)type; }
/**
* @return the type of socket to use
*/
SocketType GetSocketType() const { return (SocketType)options.type; }
/**
* Set socket domain
* @param domain: SocketDomain object.
*/
void SetSocketDomain(SocketDomain domain) { options.domain = (enum aws_socket_domain)domain; }
/**
* @return the domain type to use with the socket
*/
SocketDomain GetSocketDomain() const { return (SocketDomain)options.domain; }
/**
* Set connection timeout
* @param timeout: connection timeout in milliseconds.
*/
void SetConnectTimeoutMs(uint32_t timeout) { options.connect_timeout_ms = timeout; }
/**
* @return the connection timeout in milliseconds to use with the socket
*/
uint32_t GetConnectTimeoutMs() const { return options.connect_timeout_ms; }
/**
* Set keep alive interval seconds.
* @param keepAliveInterval: Duration, in seconds, between keepalive probes. If 0, then a default value
* is used.
*/
void SetKeepAliveIntervalSec(uint16_t keepAliveInterval)
{
options.keep_alive_interval_sec = keepAliveInterval;
}
/**
* @return the (tcp) keep alive interval to use with the socket, in seconds
*/
uint16_t GetKeepAliveIntervalSec() const { return options.keep_alive_interval_sec; }
/**
* Set keep alive time out seconds.
* @param keepAliveTimeout: interval, in seconds, that a connection must be idle for before keep alive
* probes begin to get sent out
*/
void SetKeepAliveTimeoutSec(uint16_t keepAliveTimeout)
{
options.keep_alive_timeout_sec = keepAliveTimeout;
}
/**
* @return interval, in seconds, that a connection must be idle for before keep alive probes begin
* to get sent out
*/
uint16_t GetKeepAliveTimeoutSec() const { return options.keep_alive_timeout_sec; }
/**
* Set keep alive max failed probes.
* @param maxProbes: The number of keepalive probes allowed to fail before a connection is considered
* lost.
*/
void SetKeepAliveMaxFailedProbes(uint16_t maxProbes)
{
options.keep_alive_max_failed_probes = maxProbes;
}
/**
* @return number of keepalive probes allowed to fail before a connection is considered lost.
*/
uint16_t GetKeepAliveMaxFailedProbes() const { return options.keep_alive_max_failed_probes; }
/**
* Set keep alive option.
* @param keepAlive: True, periodically transmit keepalive messages for detecting a disconnected peer.
*/
void SetKeepAlive(bool keepAlive) { options.keepalive = keepAlive; }
/**
* @return true/false if the socket implementation should use TCP keepalive
*/
bool GetKeepAlive() const { return options.keepalive; }
/// @private
aws_socket_options &GetImpl() { return options; }
/// @private
const aws_socket_options &GetImpl() const { return options; }
private:
aws_socket_options options;
};
} // namespace Io
} // namespace Crt
} // namespace Aws