24#ifdef TGT_OS_TYPE_VXWORKS
37#elif defined TGT_OS_TYPE_LINUX || TGT_OS_TYPE_DARWIN
38#include <sys/socket.h>
43#error OS not supported for IP Socket Communications
49IpSocket::IpSocket() : m_fd(-1), m_timeoutSeconds(0), m_timeoutMicroseconds(0), m_port(0), m_open(false), m_started(false) {
49IpSocket::IpSocket() : m_fd(-1), m_timeoutSeconds(0), m_timeoutMicroseconds(0), m_port(0), m_open(false), m_started(false) {
…}
54 FW_ASSERT(timeout_microseconds < 1000000, timeout_microseconds);
65#ifdef TGT_OS_TYPE_VXWORKS
69 struct timeval timeout;
73 if (setsockopt(socketFd, SOL_SOCKET, SO_SNDTIMEO,
reinterpret_cast<char *
>(&timeout),
sizeof(timeout)) < 0) {
84#ifdef TGT_OS_TYPE_VXWORKS
91 *
reinterpret_cast<unsigned long*
>(ip4) = ip;
94 if (not ::inet_pton(AF_INET, address, ip4)) {
102 bool is_started =
false;
110 bool is_open =
false;
119 if (this->
m_fd != -1) {
164 if (this->
m_fd == -1) {
172 if (((sent == -1) && (errno == EINTR)) || (sent == 0)) {
176 else if ((sent == -1) && ((errno == EBADF) || (errno == ECONNRESET))) {
181 else if (sent == -1) {
207 if (size == -1 && ((errno == EINTR) || errno == EAGAIN)) {
211 else if (size == 0 || ((size == -1) && ((errno == ECONNRESET) || (errno == EBADF)))) {
217 else if (size == -1) {
PlatformIntType NATIVE_INT_TYPE
uint8_t U8
8-bit unsigned integer
C++-compatible configuration header for fprime configuration.
@ SOCKET_MAX_HOSTNAME_SIZE
virtual I32 sendProtocol(const U8 *const data, const U32 size)=0
Protocol specific implementation of send. Called directly with retry from send.
void close()
closes the socket
U16 m_port
IP address port used.
bool isStarted()
Returns true when the socket is started.
virtual I32 recvProtocol(U8 *const data, const U32 size)=0
Protocol specific implementation of recv. Called directly with error handling from recv.
bool isOpened()
check if IP socket has previously been opened
char m_hostname[SOCKET_MAX_HOSTNAME_SIZE]
Hostname to supply.
SocketIpStatus recv(U8 *const data, I32 &size)
receive data from the IP socket from the given buffer
bool m_started
Have we successfully started the socket.
bool m_open
Have we successfully opened.
SocketIpStatus send(const U8 *const data, const U32 size)
send data out the IP socket from the given buffer
SocketIpStatus configure(const char *hostname, const U16 port, const U32 send_timeout_seconds, const U32 send_timeout_microseconds)
configure the ip socket with host and transmission timeouts
U32 m_timeoutMicroseconds
static SocketIpStatus addressToIp4(const char *address, void *ip4)
converts a given address in dot form x.x.x.x to an ip address. ONLY works for IPv4.
SocketIpStatus setupTimeouts(NATIVE_INT_TYPE socketFd)
setup the socket timeout properties of the opened outgoing socket
virtual void shutdown()
shutdown the socket
virtual SocketIpStatus openProtocol(NATIVE_INT_TYPE &fd)=0
Protocol specific open implementation, called from open.
SocketIpStatus open()
open the IP socket for communications
virtual SocketIpStatus startup()
startup the socket, a no-op on unless this is server
void unLock()
unlock the mutex
void lock()
lock the mutex
SocketIpStatus
Status enumeration for socket return values.
@ SOCK_INVALID_IP_ADDRESS
Bad IP address supplied.
@ SOCK_SUCCESS
Socket operation successful.
@ SOCK_DISCONNECTED
Failed to read socket with disconnect.
@ SOCK_READ_ERROR
Failed to read socket.
@ SOCK_FAILED_TO_SET_SOCKET_OPTIONS
Failed to configure socket.
@ SOCK_INTERRUPTED_TRY_AGAIN
Interrupted status for retries.
@ SOCK_SEND_ERROR
Failed to send after configured retries.
char * string_copy(char *destination, const char *source, U32 num)
copy string with null-termination guaranteed