/* * Copyright (C) 1997-2005 by Objective Systems, Inc. * * This software is furnished under an open source license and may be * used and copied only in accordance with the terms of this license. * The text of the license may generally be found in the root * directory of this installation in the COPYING file. It * can also be viewed online at the following URL: * * http://www.obj-sys.com/open/license.html * * Any redistributions of this file including modified versions must * maintain this copyright notice. * *****************************************************************************/ /** * @file ooSocket.h * Common runtime constants, data structure definitions, and run-time functions * to support the sockets' operations. */ #ifndef _OOSOCKET_H_ #define _OOSOCKET_H_ #include "asterisk/poll-compat.h" #include "asterisk/compiler.h" #ifdef _WIN32_WCE #include #elif defined(_WIN32) || defined(_WIN64) #include #define INCL_WINSOCK_API_TYPEDEFS 1 #define INCL_WINSOCK_API_PROTOTYPES 0 #include #else #include #include "sys/time.h" #include #include #include #include #include #include #include #endif #include "ooasn1.h" #ifdef __cplusplus extern "C" { #endif #ifndef EXTERN #ifdef MAKE_DLL #define EXTERN __declspec(dllexport) #elif defined (USEASN1DLL) #define EXTERN __declspec(dllimport) #else #define EXTERN #endif /* MAKE_DLL */ #endif /* EXTERN */ /** * @defgroup sockets Socket Layer * @{ */ #if defined (_WIN64) typedef unsigned __int64 OOSOCKET; /**< Socket's handle */ #elif defined (_WIN32) typedef unsigned int OOSOCKET; /**< Socket's handle */ #else typedef int OOSOCKET; /**< Socket's handle */ #endif #define OOSOCKET_INVALID ((OOSOCKET)-1) /** * The IP address represented as unsigned long value. The most significant 8 * bits in this unsigned long value represent the first number of the IP * address. The least significant 8 bits represent the last number of the IP * address. */ /* typedef unsigned long OOIPADDR; */ typedef struct ast_sockaddr OOIPADDR; #define OOIPADDR_ANY ((OOIPADDR)0) #define OOIPADDR_LOCAL ((OOIPADDR)0x7f000001UL) /* 127.0.0.1 */ typedef struct OOInterface{ char *name; char *addr; char *mask; struct OOInterface *next; }OOInterface; /** * This function permits an incoming connection attempt on a socket. It * extracts the first connection on the queue of pending connections on socket. * It then creates a new socket and returns a handle to the new socket. The * newly created socket is the socket that will handle the actual connection * and has the same properties as original socket. See description of 'accept' * socket function for further details. * * @param socket The socket's handle created by call to ::rtSocketCreate * function. * @param pNewSocket The pointer to variable to receive the new socket's * handle. * @param destAddr Optional pointer to a buffer that receives the IP * address of the connecting entity. It may be NULL. * @param destPort Optional pointer to a buffer that receives the port of * the connecting entity. It may be NULL. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketAccept (OOSOCKET socket, OOSOCKET *pNewSocket, char* destAddr, int* destPort); /** * This function converts an IP address to its string representation. * * @param ipAddr The IP address to be converted. * @param pbuf Pointer to the buffer to receive a string with the IP * address. * @param bufsize Size of the buffer. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketAddrToStr (OOIPADDR ipAddr, char* pbuf, int bufsize); /** * This function associates a local address with a socket. It is used on an * unconnected socket before subsequent calls to the ::rtSocketConnect or * ::rtSocketListen functions. See description of 'bind' socket function for * further details. * * @param socket The socket's handle created by call to ::rtSocketCreate * function. * @param addr The local IP address to assign to the socket. * @param port The local port number to assign to the socket. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketBind (OOSOCKET socket, OOIPADDR addr, int port); /** * This function closes an existing socket. * * @param socket The socket's handle created by call to ::rtSocketCreate * or ::rtSocketAccept function. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketClose (OOSOCKET socket); /** * This function establishes a connection to a specified socket. It is used to * create a connection to the specified destination. When the socket call * completes successfully, the socket is ready to send and receive data. See * description of 'connect' socket function for further details. * * @param socket The socket's handle created by call to ::rtSocketCreate * function. * @param host The null-terminated string with the IP address in the * following format: "NNN.NNN.NNN.NNN", where NNN is a * number in the range (0..255). * @param port The destination port to connect. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketConnect (OOSOCKET socket, const char* host, int port); /** * This function creates a socket. The only streaming TCP/IP sockets are * supported at the moment. * * @param psocket The pointer to the socket's handle variable to receive * the handle of new socket. * @param family Which family socket will created * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketCreate (OOSOCKET* psocket, int family); /** * This function creates a UDP datagram socket. * * @param psocket The pointer to the socket's handle variable to receive * the handle of new socket. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketCreateUDP (OOSOCKET* psocket, int family); /** * This function initiates use of sockets by an application. This function must * be called first before use sockets. * * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketsInit (void); /** * This function terminates use of sockets by an application. This function * must be called after done with sockets. * * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketsCleanup (void); /** * This function places a socket a state where it is listening for an incoming * connection. To accept connections, a socket is first created with the * ::rtSocketCreate function and bound to a local address with the * ::rtSocketBind function, a maxConnection for incoming connections is * specified with ::rtSocketListen, and then the connections are accepted with * the ::rtSocketAccept function. See description of 'listen' socket function * for further details. * * @param socket The socket's handle created by call to * ::rtSocketCreate function. * @param maxConnection Maximum length of the queue of pending connections. * @return Completion status of operation: 0 (ASN_OK) = * success, negative return value is error. */ EXTERN int ooSocketListen (OOSOCKET socket, int maxConnection); /** * This function is used to peek at the received data without actually removing * it from the receive socket buffer. A receive call after this will get the * same data from the socket. * @param socket The socket's handle created by call to ::rtSocketCreate * or ::rtSocketAccept function. * @param pbuf Pointer to the buffer for the incoming data. * @param bufsize Length of the buffer. * @return If no error occurs, returns the number of bytes * received. Otherwise, the negative value is error code. */ EXTERN int ooSocketRecvPeek (OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize); /** * This function receives data from a connected socket. It is used to read * incoming data on sockets. The socket must be connected before calling this * function. See description of 'recv' socket function for further details. * * @param socket The socket's handle created by call to ::rtSocketCreate * or ::rtSocketAccept function. * @param pbuf Pointer to the buffer for the incoming data. * @param bufsize Length of the buffer. * @return If no error occurs, returns the number of bytes * received. Otherwise, the negative value is error code. */ EXTERN int ooSocketRecv (OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize); /** * This function receives data from a connected/unconnected socket. It is used * to read incoming data on sockets. It populates the remotehost and * remoteport parameters with information of remote host. See description of * 'recvfrom' socket function for further details. * * @param socket The socket's handle created by call to ooSocketCreate * * @param pbuf Pointer to the buffer for the incoming data. * @param bufsize Length of the buffer. * @param remotehost Pointer to a buffer in which remote ip address * will be returned. * @param hostBufLen Length of the buffer passed for remote ip address. * @param remoteport Pointer to an int in which remote port number * will be returned. * * @return If no error occurs, returns the number of bytes * received. Otherwise, negative value. */ EXTERN int ooSocketRecvFrom (OOSOCKET socket, ASN1OCTET* pbuf, ASN1UINT bufsize, char * remotehost, ASN1UINT hostBufLen, int * remoteport); /** * This function sends data on a connected socket. It is used to write outgoing * data on a connected socket. See description of 'send' socket function for * further details. * * @param socket The socket's handle created by call to ::rtSocketCreate * or ::rtSocketAccept function. * @param pdata Buffer containing the data to be transmitted. * @param size Length of the data in pdata. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketSend (OOSOCKET socket, const ASN1OCTET* pdata, ASN1UINT size); /** * This function sends data on a connected or unconnected socket. See * description of 'sendto' socket function for further details. * * @param socket The socket's handle created by call to ::rtSocketCreate * or ::rtSocketAccept function. * @param pdata Buffer containing the data to be transmitted. * @param size Length of the data in pdata. * @param remotehost Remote host ip address to which data has to * be sent. * @param remoteport Remote port ip address to which data has to * be sent. * * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketSendTo(OOSOCKET socket, const ASN1OCTET* pdata, ASN1UINT size, const char* remotehost, int remoteport); /** * This function is used for synchronous monitoring of multiple sockets. * For more information refer to documentation of "select" system call. * * @param nfds The highest numbered descriptor to be monitored * plus one. * @param readfds The descriptors listed in readfds will be watched for * whether read would block on them. * @param writefds The descriptors listed in writefds will be watched for * whether write would block on them. * @param exceptfds The descriptors listed in exceptfds will be watched for * exceptions. * @param timeout Upper bound on amout of time elapsed before select * returns. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooSocketSelect(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval * timeout) attribute_deprecated; EXTERN int ooSocketPoll(struct pollfd *pfds, int nfds, int timeout); EXTERN int ooPDRead(struct pollfd *pfds, int nfds, int fd); EXTERN int ooPDWrite(struct pollfd *pfds, int nfds, int fd); /** * This function converts the string with IP address to a double word * representation. The converted address may be used with the ::rtSocketBind * function. * * @param pIPAddrStr The null-terminated string with the IP address in the * following format: "NNN.NNN.NNN.NNN", where NNN is a * number in the range (0..255). * @param pIPAddr Pointer to the converted IP address. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ /* EXTERN int ooSocketStrToAddr (const char* pIPAddrStr, OOIPADDR* pIPAddr); */ /** * This function converts an internet dotted ip address to network address * * @param inetIp The null-terminated string with the IP address in the * following format: "NNN.NNN.NNN.NNN", where NNN is a * number in the range (0..255). * @param netIp Buffer in which the converted address will be returned. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ /* EXTERN int ooSocketConvertIpToNwAddr(char *inetIp, unsigned char *netIp); */ /** * This function retrives the IP address of the local host. * * @param pIPAddrs Pointer to a char buffer in which local IP address will be * returned. * @return Completion status of operation: 0 (ASN_OK) = success, * negative return value is error. */ EXTERN int ooGetLocalIPAddress(char * pIPAddrs); EXTERN int ooSocketGetSockName(OOSOCKET socket, struct sockaddr_in *name, socklen_t *size); EXTERN long ooSocketHTONL(long val); EXTERN short ooSocketHTONS(short val); /** * This function is used to retrieve the ip and port number used by the socket * passed as parameter. It internally uses getsockname system call for this * purpose. * @param socket Socket for which ip and port has to be determined. * @param ip Buffer in which ip address will be returned. * @param len Length of the ip address buffer. * @param port Pointer to integer in which port number will be returned. * @param family Pointer to integer in which IP family (4 or 6) will be returned * * @return ASN_OK, on success; -ve on failed. */ EXTERN int ooSocketGetIpAndPort(OOSOCKET socket, char *ip, int len, int *port, int *family); EXTERN int ooSocketGetInterfaceList(OOCTXT *pctxt, OOInterface **ifList); /** * @} */ #ifdef __cplusplus } #endif #endif /* _OOSOCKET_H_ */