F´ Flight Software - C/C++ Documentation NASA-v1.6.0
A framework for building embedded system applications to NASA flight quality standards.
|
Helper base-class for setting up Berkley sockets. More...
#include <Drv/Ip/IpSocket.hpp>
Public Member Functions | |
IpSocket () | |
virtual | ~IpSocket () |
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 | |
bool | isOpened () |
check if IP socket has previously been opened | |
SocketIpStatus | open () |
open the IP socket for communications | |
SocketIpStatus | send (const U8 *const data, const U32 size) |
send data out the IP socket from the given buffer | |
SocketIpStatus | recv (U8 *const data, I32 &size) |
receive data from the IP socket from the given buffer | |
void | close () |
closes the socket | |
Protected Member Functions | |
SocketIpStatus | setupTimeouts (NATIVE_INT_TYPE socketFd) |
setup the socket timeout properties of the opened outgoing socket | |
virtual SocketIpStatus | openProtocol (NATIVE_INT_TYPE &fd)=0 |
Protocol specific open implementation, called from open. | |
virtual I32 | sendProtocol (const U8 *const data, const U32 size)=0 |
Protocol specific implementation of send. Called directly with retry from send. | |
virtual I32 | recvProtocol (U8 *const data, const U32 size)=0 |
Protocol specific implementation of recv. Called directly with error handling from recv. | |
Static Protected Member Functions | |
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. | |
Protected Attributes | |
Os::Mutex | m_lock |
NATIVE_INT_TYPE | m_fd |
U32 | m_timeoutSeconds |
U32 | m_timeoutMicroseconds |
U16 | m_port |
IP address port used. | |
bool | m_open |
Have we successfully opened. | |
char | m_hostname [SOCKET_MAX_HOSTNAME_SIZE] |
Hostname to supply. | |
Helper base-class for setting up Berkley sockets.
Certain IP headers have conflicting definitions with the m_data member of various types in fprime. TcpHelper separates the ip setup from the incoming Fw::Buffer in the primary component class preventing this collision.
Definition at line 45 of file IpSocket.hpp.
Drv::IpSocket::IpSocket | ( | ) |
Definition at line 49 of file IpSocket.cpp.
|
inlinevirtual |
Definition at line 48 of file IpSocket.hpp.
|
staticprotected |
converts a given address in dot form x.x.x.x to an ip address. ONLY works for IPv4.
address | address to convert |
ip4 | IPv4 representation structure to fill |
Definition at line 80 of file IpSocket.cpp.
void Drv::IpSocket::close | ( | ) |
closes the socket
Closes the socket opened by the open call. In this case of the TcpServer, this does NOT close server's listening port (call shutdown
) but will close the active client connection.
Definition at line 109 of file IpSocket.cpp.
SocketIpStatus Drv::IpSocket::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
Configures the IP handler (Tcp, Tcp server, and Udp) to use the given hostname and port. When multiple ports are used for send/receive these settings affect the send direction (as is the case for udp). Hostname DNS translation is left up to the caller and thus hostname must be an IP address in dot-notation of the form "x.x.x.x". Port cannot be set to 0 as dynamic port assignment is not supported.
Note: for UDP sockets this is equivalent to configureSend
and only sets up the transmission direction of the socket. A separate call to configureRecv
is required to receive on the socket and should be made before the open
call has been made.
hostname | socket uses for outgoing transmissions (and incoming when tcp). Must be of form x.x.x.x |
port | port socket uses for outgoing transmissions (and incoming when tcp). Must NOT be 0. |
send_timeout_seconds | send timeout seconds portion |
send_timeout_microseconds | send timeout microseconds portion. Must be less than 1000000 |
Definition at line 53 of file IpSocket.cpp.
bool Drv::IpSocket::isOpened | ( | ) |
check if IP socket has previously been opened
Check if this IpSocket has previously been opened. In the case of Udp this will check for outgoing transmissions and (if configured) incoming transmissions as well. This does not guarantee errors will not occur when using this socket as the remote component may have disconnected.
Definition at line 101 of file IpSocket.cpp.
SocketIpStatus Drv::IpSocket::open | ( | ) |
open the IP socket for communications
This will open the IP socket for communication. This method error checks and validates properties set using the configure
method. Tcp sockets will open bidirectional communication assuming the configure
function was previously called. Udp sockets allow configureRecv
and configure
/configureSend
calls to configure for each direction separately and may be operated in a single-direction or bidirectional mode. This call returns a status of SOCK_SEND means the port is ready for transmissions and any other status should be treated as an error with the socket not capable of sending nor receiving. This method will properly close resources on any unsuccessful status.
In the case of server components (TcpServer) this function will block until a client has connected.
Note: delegates to openProtocol for protocol specific implementation
Definition at line 120 of file IpSocket.cpp.
|
protectedpure virtual |
Protocol specific open implementation, called from open.
fd | (output) file descriptor opened. Only valid on SOCK_SUCCESS. Otherwise will be invalid |
Implemented in Drv::TcpClientSocket, Drv::TcpServerSocket, and Drv::UdpSocket.
SocketIpStatus Drv::IpSocket::recv | ( | U8 *const | data, |
I32 & | size | ||
) |
receive data from the IP socket from the given buffer
Receives data from the IpSocket. Should the socket be unavailable, SOCK_DISCONNECTED will be returned and the socket should be reopened using the open
call. This can happen even when the socket has already been opened should a transmission error/closure be detected. Since this blocks until data is available, it will retry as long as EINTR is set and less than a max number of iterations has passed. This function will block to receive data and will retry (up to a configured set of retries) as long as EINTR is returned.
Note: delegates to recvProtocol
to send the data
data | pointer to data to fill with received data |
size | maximum size of data buffer to fill |
Definition at line 173 of file IpSocket.cpp.
|
protectedpure virtual |
Protocol specific implementation of recv. Called directly with error handling from recv.
data | data pointer to fill |
size | size of data buffer |
Implemented in Drv::TcpClientSocket, Drv::TcpServerSocket, and Drv::UdpSocket.
SocketIpStatus Drv::IpSocket::send | ( | const U8 *const | data, |
const U32 | size | ||
) |
send data out the IP socket from the given buffer
Sends data out of the IpSocket. This outgoing transmission will be retried several times if the transmission fails to send all the data. Retries are globally configured in the IpCfg.hpp
header. Should the socket be unavailable, SOCK_DISCONNECTED is returned and the socket should be reopened using the open
call. This can happen even when the socket has already been opened should a transmission error/closure be detected. Unless an error is received, all data will have been transmitted.
Note: delegates to sendProtocol
to send the data
data | pointer to data to send |
size | size of data to send |
Definition at line 138 of file IpSocket.cpp.
|
protectedpure virtual |
Protocol specific implementation of send. Called directly with retry from send.
data | data to send |
size | size of data to send |
Implemented in Drv::TcpClientSocket, Drv::TcpServerSocket, and Drv::UdpSocket.
|
protected |
setup the socket timeout properties of the opened outgoing socket
socketFd | file descriptor to setup |
Definition at line 63 of file IpSocket.cpp.
|
protected |
Definition at line 177 of file IpSocket.hpp.
|
protected |
Hostname to supply.
Definition at line 182 of file IpSocket.hpp.
|
protected |
Definition at line 176 of file IpSocket.hpp.
|
protected |
Have we successfully opened.
Definition at line 181 of file IpSocket.hpp.
|
protected |
IP address port used.
Definition at line 180 of file IpSocket.hpp.
|
protected |
Definition at line 179 of file IpSocket.hpp.
|
protected |
Definition at line 178 of file IpSocket.hpp.