MQTT C Client Libraries Internals
Macros | Functions | Variables
Socket.c File Reference

Socket related functions. More...

#include "Socket.h"
#include "Log.h"
#include "SocketBuffer.h"
#include "Messages.h"
#include "StackTrace.h"
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <ctype.h>
#include "Heap.h"
Include dependency graph for Socket.c:

Macros

#define ADDRLEN   INET6_ADDRSTRLEN+1
 
#define PORTLEN   10
 

Functions

int Socket_setnonblocking (int sock)
 Set a socket non-blocking, OS independently. More...
 
int Socket_error (char *aString, int sock)
 Gets the specific error corresponding to SOCKET_ERROR. More...
 
int Socket_addSocket (int newSd)
 Add a socket to the list of socket to check with select. More...
 
int isReady (int socket, fd_set *read_set, fd_set *write_set)
 Don't accept work from a client unless it is accepting work back, i.e. More...
 
int Socket_writev (int socket, iobuf *iovecs, int count, unsigned long *bytes)
 Attempts to write a series of iovec buffers to a socket in one system call so that they are sent as one packet. More...
 
int Socket_close_only (int socket)
 Close a socket without removing it from the select list. More...
 
int Socket_continueWrite (int socket)
 Continue an outstanding write for a particular socket. More...
 
int Socket_continueWrites (fd_set *pwset, int *sock)
 Continue any outstanding writes for a socket set. More...
 
char * Socket_getaddrname (struct sockaddr *sa, int sock)
 Convert a numeric address to character string. More...
 
int Socket_abortWrite (int socket)
 Continue an outstanding write for a particular socket. More...
 
void Socket_outInitialize (void)
 Initialize the socket module.
 
void Socket_outTerminate (void)
 Terminate the socket module.
 
int Socket_getReadySocket (int more_work, struct timeval *tp, mutex_type mutex, int *rc)
 Returns the next socket ready for communications as indicated by select. More...
 
int Socket_getch (int socket, char *c)
 Reads one byte from a socket. More...
 
char * Socket_getdata (int socket, size_t bytes, size_t *actual_len, int *rc)
 Attempts to read a number of bytes from a socket, non-blocking. More...
 
int Socket_noPendingWrites (int socket)
 Indicate whether any data is pending outbound for a socket. More...
 
int Socket_putdatas (int socket, char *buf0, size_t buf0len, PacketBuffers bufs)
 Attempts to write a series of buffers to a socket in one system call so that they are sent as one packet. More...
 
void Socket_addPendingWrite (int socket)
 Add a socket to the pending write list, so that it is checked for writing in select. More...
 
void Socket_clearPendingWrite (int socket)
 Clear a socket from the pending write list - if one was added with Socket_addPendingWrite. More...
 
void Socket_close (int socket)
 Close a socket and remove it from the select list. More...
 
int Socket_new (const char *addr, size_t addr_len, int port, int *sock)
 Create a new socket and TCP connect to an address/port. More...
 
void Socket_setWriteCompleteCallback (Socket_writeComplete *mywritecomplete)
 
char * Socket_getpeer (int sock)
 Get information about the other end connected to a socket. More...
 

Variables

Sockets mod_s
 Structure to hold all socket data for this module.
 
static fd_set wset
 
static Socket_writeComplete * writecomplete = NULL
 

Detailed Description

Socket related functions.

Some other related functions are in the SocketBuffer module

Function Documentation

◆ isReady()

int isReady ( int  socket,
fd_set *  read_set,
fd_set *  write_set 
)

Don't accept work from a client unless it is accepting work back, i.e.

its socket is writeable this seems like a reasonable form of flow control, and practically, seems to work.

Parameters
socketthe socket to check
read_setthe socket read set (see select doc)
write_setthe socket write set (see select doc)
Returns
boolean - is the socket ready to go?
Here is the call graph for this function:

◆ Socket_abortWrite()

int Socket_abortWrite ( int  socket)

Continue an outstanding write for a particular socket.

Parameters
socketthat socket
Returns
completion code: 0=incomplete, 1=complete, -1=socket error
Here is the call graph for this function:

◆ Socket_addPendingWrite()

void Socket_addPendingWrite ( int  socket)

Add a socket to the pending write list, so that it is checked for writing in select.

This is used in connect processing when the TCP connect is incomplete, as we need to check the socket for both ready to read and write states.

Parameters
socketthe socket to add

◆ Socket_addSocket()

int Socket_addSocket ( int  newSd)

Add a socket to the list of socket to check with select.

Parameters
newSdthe new socket to add
Here is the call graph for this function:

◆ Socket_clearPendingWrite()

void Socket_clearPendingWrite ( int  socket)

Clear a socket from the pending write list - if one was added with Socket_addPendingWrite.

Parameters
socketthe socket to remove

◆ Socket_close()

void Socket_close ( int  socket)

Close a socket and remove it from the select list.

Parameters
socketthe socket to close
Returns
completion code
Here is the call graph for this function:

◆ Socket_close_only()

int Socket_close_only ( int  socket)

Close a socket without removing it from the select list.

Parameters
socketthe socket to close
Returns
completion code
Here is the call graph for this function:

◆ Socket_continueWrite()

int Socket_continueWrite ( int  socket)

Continue an outstanding write for a particular socket.

Parameters
socketthat socket
Returns
completion code: 0=incomplete, 1=complete, -1=socket error
Here is the call graph for this function:

◆ Socket_continueWrites()

int Socket_continueWrites ( fd_set *  pwset,
int *  sock 
)

Continue any outstanding writes for a socket set.

Parameters
pwsetthe set of sockets
sockin case of a socket error contains the affected socket
Returns
completion code, 0 or SOCKET_ERROR
Here is the call graph for this function:

◆ Socket_error()

int Socket_error ( char *  aString,
int  sock 
)

Gets the specific error corresponding to SOCKET_ERROR.

Parameters
aStringthe function that was being used when the error occurred
sockthe socket on which the error occurred
Returns
the specific TCP error code
Here is the call graph for this function:

◆ Socket_getaddrname()

char * Socket_getaddrname ( struct sockaddr *  sa,
int  sock 
)

Convert a numeric address to character string.

Parameters
sasocket numerical address
socksocket
Returns
the peer information

maximum length of the address string

maximum length of the port string

◆ Socket_getch()

int Socket_getch ( int  socket,
char *  c 
)

Reads one byte from a socket.

Parameters
socketthe socket to read from
cthe character read, returned
Returns
completion code
Here is the call graph for this function:

◆ Socket_getdata()

char* Socket_getdata ( int  socket,
size_t  bytes,
size_t *  actual_len,
int *  rc 
)

Attempts to read a number of bytes from a socket, non-blocking.

If a previous read did not finish, then retrieve that data.

Parameters
socketthe socket to read from
bytesthe number of bytes to read
actual_lenthe actual number of bytes read
Returns
completion code
Here is the call graph for this function:

◆ Socket_getpeer()

char* Socket_getpeer ( int  sock)

Get information about the other end connected to a socket.

Parameters
sockthe socket to inquire on
Returns
the peer information
Here is the call graph for this function:

◆ Socket_getReadySocket()

int Socket_getReadySocket ( int  more_work,
struct timeval *  tp,
mutex_type  mutex,
int *  rc 
)

Returns the next socket ready for communications as indicated by select.

Parameters
more_workflag to indicate more work is waiting, and thus a timeout value of 0 should be used for the select
tpthe timeout to be used for the select, unless overridden
rca value other than 0 indicates an error of the returned socket
Returns
the socket next ready, or 0 if none is ready
Here is the call graph for this function:

◆ Socket_new()

int Socket_new ( const char *  addr,
size_t  addr_len,
int  port,
int *  sock 
)

Create a new socket and TCP connect to an address/port.

Parameters
addrthe address string
portthe TCP port
sockreturns the new socket
timeoutthe timeout in milliseconds
Returns
completion code
Here is the call graph for this function:

◆ Socket_noPendingWrites()

int Socket_noPendingWrites ( int  socket)

Indicate whether any data is pending outbound for a socket.

Returns
boolean - true == data pending.
Here is the call graph for this function:

◆ Socket_putdatas()

int Socket_putdatas ( int  socket,
char *  buf0,
size_t  buf0len,
PacketBuffers  bufs 
)

Attempts to write a series of buffers to a socket in one system call so that they are sent as one packet.

Parameters
socketthe socket to write to
buf0the first buffer
buf0lenthe length of data in the first buffer
countnumber of buffers
buffersan array of buffers to write
buflensan array of corresponding buffer lengths
Returns
completion code, especially TCPSOCKET_INTERRUPTED
Here is the call graph for this function:

◆ Socket_setnonblocking()

int Socket_setnonblocking ( int  sock)

Set a socket non-blocking, OS independently.

Parameters
sockthe socket to set non-blocking
Returns
TCP call error code

◆ Socket_writev()

int Socket_writev ( int  socket,
iobuf *  iovecs,
int  count,
unsigned long *  bytes 
)

Attempts to write a series of iovec buffers to a socket in one system call so that they are sent as one packet.

Parameters
socketthe socket to write to
iovecsan array of buffers to write
countnumber of buffers in iovecs
bytesnumber of bytes actually written returned
Returns
completion code, especially TCPSOCKET_INTERRUPTED
Here is the call graph for this function: