63 #include <sys/types.h> 64 #include <sys/socket.h> 66 #include <netinet/in.h> 68 #include <arpa/inet.h> 86 #define HOST_NAME_MAX 64 109 return ntohs(huShort);
119 return htons(huShort);
157 struct hostent *pHostEntry;
158 struct in_addr addrInet;
161 if( inet_aton(sHostName, &addrInet) != 0 )
163 memcpy(pAddrInet, &addrInet,
sizeof(addrInet));
166 else if( (pHostEntry = gethostbyname(sHostName)) !=
NULL )
168 memcpy(pAddrInet, pHostEntry->h_addr, (
size_t)pHostEntry->h_length);
172 LOGERROR(
"gethostbyname(%s): %s", sHostName, hstrerror(h_errno));
205 struct sockaddr *pAddr,
206 const char *sHostName)
210 char bufAddr[INET6_ADDRSTRLEN];
213 char bufHost[NI_MAXHOST];
224 nAddrSize =
sizeof(
struct sockaddr_in);
225 pAddrIn = &(((
struct sockaddr_in *)pAddr)->sin_addr);
226 uPort = (
uint_t)(((
struct sockaddr_in *)pAddr)->sin_port);
229 else if( af == AF_INET6 )
231 nAddrSize =
sizeof(
struct sockaddr_in6);
232 pAddrIn = &(((
struct sockaddr_in6 *)pAddr)->sin6_addr);
233 uPort = (
uint_t)(((
struct sockaddr_in6 *)pAddr)->sin6_port);
242 if( inet_ntop(af, pAddrIn, bufAddr, (socklen_t)
sizeof(bufAddr)) !=
NULL )
247 bufPort[
sizeof(bufPort)-1] = 0;
253 strcpy(bufAddr,
"ADDR???");
257 if( sHostName !=
NULL )
259 sHost = (
char *)sHostName;
263 else if( (af == AF_INET)
264 && (((
struct in_addr *)pAddrIn)->s_addr == INADDR_ANY) )
273 getnameinfo(pAddr, (socklen_t)nAddrSize,
274 bufHost, (socklen_t)
sizeof(bufHost),
275 NULL, (socklen_t)0, NI_NOFQDN);
278 sAddrName =
NEWSTR(strlen(sHost)+strlen(bufAddr)+strlen(bufPort)+3);
280 sprintf(sAddrName,
"%s(%s%s)", sHost, bufAddr, bufPort);
304 const char *sHostName)
306 char bufHost[NI_MAXHOST];
311 if( sHostName !=
NULL )
313 sHost = (
char *)sHostName;
316 else if( gethostname(bufHost,
sizeof(bufHost)) < 0 )
325 sAddrName =
NEWSTR(strlen(sHost)+strlen(pAddrUnix->sun_path)+3);
327 sprintf(sAddrName,
"%s(%s)", sHost, pAddrUnix->sun_path);
351 af = pAddr->sa_family;
382 char sAddr[INET6_ADDRSTRLEN];
383 struct hostent *pHostEntry;
387 if( gethostname(sHostName,
sizeof(sHostName)) == -1 )
392 sHostName[
sizeof(sHostName)-1] = 0;
395 if( (pHostEntry = gethostbyname(sHostName)) ==
NULL )
397 LOGERROR(
"gethostbyname(%s): %s", sHostName, hstrerror(h_errno));
402 if( pHostEntry->h_addr_list && pHostEntry->h_addr_list[0] )
404 if( inet_ntop(pHostEntry->h_addrtype, pHostEntry->h_addr_list[0],
405 sAddr, (socklen_t)
sizeof(sAddr)) ==
NULL )
407 LOGSYSERROR(
"inet_ntop(%d, ...)", pHostEntry->h_addrtype);
408 strcpy(sAddr,
"ADDR???");
413 strcpy(sAddr,
"ADDR???");
415 sAddr[
sizeof(sAddr)-1] = 0;
417 p =
NEWSTR(strlen(sHostName)+strlen(sAddr)+2);
418 sprintf(p,
"%s(%s)", sHostName, sAddr);
459 if( pSocket ==
NULL )
559 CHKPTR(pSocket, (
size_t)0);
575 CHKPTR(pSocket, (
size_t)0);
646 struct sockaddr_un addr;
653 sizAddr = (socklen_t)
sizeof(addr);
662 else if( getsockname(pSocket->
m_sd, (
struct sockaddr *)&addr, &sizAddr) < 0 )
696 struct sockaddr *pAddr,
697 const char *sHostName)
710 else if( pAddr !=
NULL )
716 else if( sHostName !=
NULL )
738 return pSocket->
m_sd;
750 if( (pSocket->
m_sd = sd) < 0 )
826 return ((
int)(pSocket->
m_eFlavor) & nMask) == nFlavor?
true:
false;
841 if( fcntl(pSocket->
m_sd, F_SETFL, O_NONBLOCK) < 0 )
864 if( (rc = getsockopt(pSocket->
m_sd, SO_RCVTIMEO, &tv)) < 0 )
890 if( pSocket ==
NULL )
917 else if( fcntl(pSocket->
m_sd, F_GETFL, &fopts) >= 0 )
945 struct sockaddr_in addrInet;
955 if( (sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 )
957 LOGSYSERROR(
"socket(%d,%d,%d)", PF_INET, SOCK_STREAM, IPPROTO_TCP);
968 if( setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
969 &nVal, (socklen_t)
sizeof(nVal)) < 0 )
971 LOGSYSERROR(
"setsockopt(%d,SOL_SOCKET,SO_REUSEADDR)", sd);
979 if( setsockopt(sd, SOL_SOCKET, SO_KEEPALIVE,
980 &nVal, (socklen_t)
sizeof(nVal)) < 0 )
982 LOGSYSERROR(
"setsockopt(%d,SOL_SOCKET,SO_KEEPALIVE)", sd);
988 addrInet.sin_family = AF_INET;
989 addrInet.sin_port =
htons_nowarn((uint16_t)ipPortListener);
996 if( sLocalHostName ==
NULL )
998 addrInet.sin_addr.s_addr = htonl(INADDR_ANY);
1006 LOGERROR(
"SockResolveHostName() failed");
1014 if( bind(sd, (
struct sockaddr *)&addrInet, (socklen_t)
sizeof(addrInet)) < 0 )
1026 if( listen(sd, backlog) < 0 )
1062 struct sockaddr_in addrInet;
1068 if( (sd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 )
1070 LOGSYSERROR(
"socket(%d,%d,%d)", PF_INET, SOCK_STREAM, IPPROTO_TCP);
1077 addrInet.sin_family = AF_INET;
1083 LOGERROR(
"SockResolveHostName() failed");
1091 if(connect(sd, (
struct sockaddr *)&addrInet, (socklen_t)
sizeof(addrInet)) < 0)
1129 struct sockaddr_in addrInet;
1137 if( (sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0 )
1139 LOGSYSERROR(
"socket(%d,%d,%d)", PF_INET, SOCK_DGRAM, IPPROTO_UDP);
1146 memset((
void*)&addrInet, 0,
sizeof(addrInet));
1147 addrInet.sin_family = AF_INET;
1156 if( sLocalHostName ==
NULL )
1158 addrInet.sin_addr.s_addr = htonl(INADDR_ANY);
1166 LOGERROR(
"SockResolveHostName() failed");
1174 if( bind(sd, (
struct sockaddr *)&addrInet, (socklen_t)
sizeof(addrInet)) < 0 )
1243 struct sockaddr saddr;
1244 unsigned int addrlen =
sizeof(saddr);
1250 if((sd = accept(pSocketListener->
m_sd, &saddr, (socklen_t *)&addrlen)) == -1)
1273 LOGERROR(
"SockAttrSetNonBlocking() failed");
1298 shutdown(pSocket->
m_sd, SHUT_RDWR);
1300 if( close(pSocket->
m_sd) < 0 )
1374 LOGDIAG4(
"SocketRead: read()=%d", nRead);
1420 LOGERROR(
"Socket is not open for writing");
1474 ssize_t n, nWritten=0;
1495 #ifdef debugSockUTest 1504 LOGDIAG4(
"SocketUTest: SocketOpenTcpListener(9192, ANYHOST)");
1508 LOGERROR(
"SocketOpenTcpListener() failed");
1518 LOGDIAG4(
"SocketUTest: SocketOpenTcpListener(9192, nouturn)");
1522 LOGERROR(
"SocketOpenTcpListener() failed");
1532 LOGDIAG4(
"SocketUTest: SocketOpenTcpConnection(pedxing, 21)");
1535 LOGERROR(
"SocketOpenTcpConnection() failed");
1545 LOGDIAG4(
"SocketUTest: SocketOpenUdp(9193, ANYHOST)");
1548 LOGERROR(
"SocketOpenUdp() failed");
1558 LOGDIAG4(
"SocketUTest: SocketOpenUdp(9193, 192.168.1.2)");
1561 LOGERROR(
"SocketOpenUdp() failed");
1572 #endif // debugSockUTest void * m_pClientData
client data
Socket_T * SocketNew()
Allocate a new, unconnected socket.
static byte_t * SimpleBufGetReadPtr(SimpleBuf_T *pBuf)
Returns pointer to internal I/O buffer at the current read position.
SimpleBuf_T * SimpleBufNew()
Allocate a new simple buffer with no internal buffer allocation.
#define _TINT(var)
int (decimal)
const char * SocketAttrGetRemoteName(Socket_T *pSocket)
Get Socket remote name.
#define NEWSTR(len)
Allocate new string buffer of length len+1.
#define SOCK_IO_READ
read index
INLINE_IN_H bool_t SocketAttrIsConnection(Socket_T *pSocket)
Test if socket is connection flavor.
static size_t SimpleBufHasSize(SimpleBuf_T *pBuf)
Returns size of buffer.
void SocketDelete(Socket_T *pSocket)
Delate an allocated socket.
connection/connectionless
static void fdset_nowarn(int fd, fd_set *pset)
FD_SET() wrapper with no annoying warnings.
char * new_strdup(const char *s)
Duplicate a string.
#define SOCK_RC_IODONE
finished current I/O
Socket_T * SocketOpenUnixPair(int nType)
Create and open a new UNIX pair socket.
bool_t SocketAttrHasFlavor(Socket_T *pSocket, int nMask, int nFlavor)
Check if Socket has an assigned flavor.
#define SIMPLEBUF_REL
relative
SimpleBuf_T * m_pIOBuf[SOCK_IO_NUMOF]
read/write buffers
#define CHKPTR(p,...)
Checks validity of pointer.
#define LOGDIAG3(fmt,...)
Standard Diagnostic Level 3 logging.
byte_t * m_pRWBuf
internal read/write buffer
char * SocketThisHostName()
Get the host string name of this network node (computer).
#define SOCK_RC_EBADSD
bad/closed socket descriptor
void SocketAttrSetRemoteName(Socket_T *pSocket, struct sockaddr *pAddr, const char *sHostName)
Set Socket remote name.
int SocketAttrSetNonBlocking(Socket_T *pSocket)
Set Socket for non-blockiong I/O.
static size_t SimpleBufHasLen(SimpleBuf_T *pBuf)
Returns number of bytes currently in buffer.
Memory allocation and deallocation declarations.
#define SOCK_PORT_NONE
no port number specified
#define SOCK_RC_ENOBUF
no buffer
const char * SockStrUnknownHost
unknown host
u32_t uint_t
32-bit unsigned integer
ssize_t SocketRead(Socket_T *pSocket)
Reads the next available bytes from the Socket into in the Socket's read buffer.
SimpleBuf_T * SimpleBufNewWithBuf(size_t nBufSize)
Allocate a new simple buffer with internal buffer of nBufSize.
Socket_T * SocketOpenTcpConnection(const char *sRemoteHostName, int ipPortRemote)
Create and open a new TCP/IP socket to the given remote host and port.
void SocketAttrSetSd(Socket_T *pSocket, int sd)
Set Socket socket (file) descriptor.
#define SOCK_RC_EBUFFULL
buffer is full
void SimpleBufDelete(SimpleBuf_T *pBuf)
Delete a simple buffer along with the internal buffer.
void SocketAttrSetFlavor(Socket_T *pSocket, SockFlavor eFlavor)
Set Socket flavor.
#define PRAGMA_IGNORED(filter)
Disable compiler warnings on the diagnostics filter.
#define LOGSYSERROR(fmt,...)
Standard System Error logging.
const char * SocketAttrGetLocalName(Socket_T *pSocket)
Get Socket local name.
#define HOST_NAME_MAX
maximum host name length
ssize_t SocketWriteAll(Socket_T *pSocket)
Writes all of the bytes from the socket's write buffer until no more bytes or error.
SimpleBuf_T * SocketBufSetBuf(Socket_T *pSocket, int eIOBuf, byte_t *pBuf, size_t nBufSize)
Attach a buffer to Socket.
const char * SockStrClosed
closed socket
static size_t SimpleBufHasAvail(SimpleBuf_T *pBuf)
Returns number of bytes available in buffer for writing.
void SocketAttrSetLocalName(Socket_T *pSocket, const char *sHostName)
Set Socket local name.
void SocketAttrSetClientData(Socket_T *pSocket, void *pClientData)
Get Socket client user data.
static char * SocketAddrNameUnix(struct sockaddr_un *pAddrUnix, const char *sHostName)
Allocate formated UNIX name.
#define LOGERROR(fmt,...)
Standard Error logging.
char * m_sLocalName
local name
ssize_t SocketWrite(Socket_T *pSocket)
Writes the bytes from the Socket's write buffer to the Socket connection.
#define LOGDIAG4(fmt,...)
Standard Diagnostic Level 4 logging.
void * SocketAttrGetClientData(Socket_T *pSocket)
Get Socket client user data.
size_t SocketBufGetSize(Socket_T *pSocket, int eIOBuf)
Get Socket buffer size.
bool_t SocketStateIsOpen(Socket_T *pSocket)
Check if Socket is open.
#define NEW(T)
Allocate new type.
Socket services declarations.
static char * SocketAddrName(struct sockaddr *pAddr, const char *sHostName)
Allocate formated address name.
const char * SockStrLocalHost
local host
#define SOCK_RC_EBADSOCK
socket is bad
Socket_T * SocketOpenTcpListener(int ipPortListener, const char *sLocalHostName)
Create and open a new TCP/IP passive listener socket on this host.
void SimpleBufSetBuf(SimpleBuf_T *pBuf, byte_t *pRWBuf, size_t nBufSize, size_t nLen)
Set simple buffer's internal read/write buffer.
#define SOCK_CHK_IO(io,...)
Check I/O index.
int SocketAttrGetSd(Socket_T *pSocket)
Get Socket socket (file) descriptor.
void SocketAttrSetPort(Socket_T *pSocket, int ipPort)
Set Socket port number.
SockFlavor m_eFlavor
socket type
RoadNarrows Robotics common configuration file.
const char * SockStrAnyHost
any host
Socket_T * SocketAccept(Socket_T *pSocketListener, bool_t bNonBlock)
Accept a client connection requst from the listener socket.
static char * SocketAddrNameInet(int af, struct sockaddr *pAddr, const char *sHostName)
Allocate formated internet name (IPV4, IPV6).
#define _TSTR(var)
string variable
#define SOCK_RC_ESYSERR
system error occurred
#define SOCK_SD_CLOSED
closed socket descriptor value
Socket_T * SocketOpenUdp(int ipPortUdp, const char *sLocalHostName)
Create and open a new UDP/IP connectionless socket. port.
SimpleBuf_T * SocketBufNewBuf(Socket_T *pSocket, int eIOBuf, size_t nBufSize)
Allocate a socket buffer and attach to Socket.
static size_t SimpleBufWriteSeek(SimpleBuf_T *pBuf, size_t wpos, int how)
Seek buffer write head to the new write position.
SimpleBuf_T * SocketBufGetBuf(Socket_T *pSocket, int eIOBuf)
Get Socket buffer.
int SocketClose(Socket_T *pSocket)
Close a Socket.
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
#define PRAGMA_WARNING(filter)
Enable compiler warnings on the diagnostics filter.
static size_t SimpleBufReadSeek(SimpleBuf_T *pBuf, size_t rpos, int how)
Seek buffer read head to the new read position.
const char * SockStrDisconnected
disconnected
int m_sd
(open) socket descriptor
u16_t ushort_t
16-bit unsigned integer
SockFlavor SocketAttrGetFlavor(Socket_T *pSocket)
Get Socket flavor.
static ushort_t htons_nowarn(ushort_t huShort)
htons() wrapper with no annoying warnings.
void SocketBufClear(Socket_T *pSocket, int eIOBuf)
Clear a Socket buffer.
Socket_T * SocketOpenUnix(int ipPortUdp, int nType)
Create and open a new UNIX connectionless socket.
static ushort_t ntohs_nowarn(ushort_t huShort)
ntohs() wrapper with no annoying warnings.
#define SOCK_IO_NUMOF
number of indices
bool_t SocketStateIsErrored(Socket_T *pSocket)
Check if Socket is in some kind of errored state.
static int SockResolveHostName(const char *sHostName, struct in_addr *pAddrInet)
Resolve host name into IP address (IPV4 only).
byte_t * SocketBufGetRawBuf(Socket_T *pSocket, int eIOBuf)
Get Socket raw buffer.
size_t SocketBufGetLen(Socket_T *pSocket, int eIOBuf)
Get number of bytes in Socket buffer.
int SocketAttrGetPort(Socket_T *pSocket)
Get Socket port number.
#define SOCK_IO_WRITE
write index
Simple [io] buffer declarations and operations.
static void SimpleBufClear(SimpleBuf_T *pBuf)
Clear contents of buffer.
char * m_sRemoteName
remote name
static byte_t * SimpleBufGetWritePtr(SimpleBuf_T *pBuf)
Returns pointer to internal I/O buffer at the current write position.