📄 sock.h
字号:
/* $Id: sock.h 1104 2007-03-25 18:44:51Z bennylp $ */
/*
* Copyright (C)2003-2007 Benny Prijono <benny@prijono.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef __PJ_SOCK_H__
#define __PJ_SOCK_H__
/**
* @file sock.h
* @brief Socket Abstraction.
*/
#include <pj/types.h>
PJ_BEGIN_DECL
/**
* @defgroup PJ_SOCK Socket Abstraction
* @ingroup PJ_IO
* @{
*
* The PJLIB socket abstraction layer is a thin and very portable abstraction
* for socket API. It provides API similar to BSD socket API. The abstraction
* is needed because BSD socket API is not always available on all platforms,
* therefore it wouldn't be possible to create a trully portable network
* programs unless we provide such abstraction.
*
* Applications can use this API directly in their application, just
* as they would when using traditional BSD socket API, provided they
* call #pj_init() first.
*
* \section pj_sock_examples_sec Examples
*
* For some examples on how to use the socket API, please see:
*
* - \ref page_pjlib_sock_test
* - \ref page_pjlib_select_test
* - \ref page_pjlib_sock_perf_test
*/
/**
* Supported address families.
* APPLICATION MUST USE THESE VALUES INSTEAD OF NORMAL AF_*, BECAUSE
* THE LIBRARY WILL DO TRANSLATION TO THE NATIVE VALUE.
*/
extern const pj_uint16_t PJ_AF_UNIX; /**< Unix domain socket. */
#define PJ_AF_LOCAL PJ_AF_UNIX; /**< POSIX name for AF_UNIX */
extern const pj_uint16_t PJ_AF_INET; /**< Internet IP protocol. */
extern const pj_uint16_t PJ_AF_INET6; /**< IP version 6. */
extern const pj_uint16_t PJ_AF_PACKET; /**< Packet family. */
extern const pj_uint16_t PJ_AF_IRDA; /**< IRDA sockets. */
/**
* Supported types of sockets.
* APPLICATION MUST USE THESE VALUES INSTEAD OF NORMAL SOCK_*, BECAUSE
* THE LIBRARY WILL TRANSLATE THE VALUE TO THE NATIVE VALUE.
*/
extern const pj_uint16_t PJ_SOCK_STREAM; /**< Sequenced, reliable, connection-
based byte streams. */
extern const pj_uint16_t PJ_SOCK_DGRAM; /**< Connectionless, unreliable
datagrams of fixed maximum
lengths. */
extern const pj_uint16_t PJ_SOCK_RAW; /**< Raw protocol interface. */
extern const pj_uint16_t PJ_SOCK_RDM; /**< Reliably-delivered messages. */
/**
* Socket level specified in #pj_sock_setsockopt() or #pj_sock_getsockopt().
* APPLICATION MUST USE THESE VALUES INSTEAD OF NORMAL SOL_*, BECAUSE
* THE LIBRARY WILL TRANSLATE THE VALUE TO THE NATIVE VALUE.
*/
extern const pj_uint16_t PJ_SOL_SOCKET; /**< Socket level. */
extern const pj_uint16_t PJ_SOL_IP; /**< IP level. */
extern const pj_uint16_t PJ_SOL_TCP; /**< TCP level. */
extern const pj_uint16_t PJ_SOL_UDP; /**< UDP level. */
extern const pj_uint16_t PJ_SOL_IPV6; /**< IP version 6 */
/* IP_TOS
*
* Note:
* TOS CURRENTLY DOES NOT WORK IN Windows 2000 and above!
* See http://support.microsoft.com/kb/248611
*/
extern const pj_uint16_t PJ_IP_TOS; /**< IP_TOS optname in setsockopt() */
/*
* IP TOS related constats.
*
* Note:
* TOS CURRENTLY DOES NOT WORK IN Windows 2000 and above!
* See http://support.microsoft.com/kb/248611
*/
extern const pj_uint16_t PJ_IPTOS_LOWDELAY; /**< Minimize delays */
extern const pj_uint16_t PJ_IPTOS_THROUGHPUT; /**< Optimize throughput */
extern const pj_uint16_t PJ_IPTOS_RELIABILITY; /**< Optimize for reliability*/
extern const pj_uint16_t PJ_IPTOS_MINCOST; /**< "filler data" where slow
transmission does't matter */
/**
* Values to be specified as \c optname when calling #pj_sock_setsockopt()
* or #pj_sock_getsockopt().
*/
extern const pj_uint16_t PJ_SO_TYPE; /**< Socket type. */
extern const pj_uint16_t PJ_SO_RCVBUF; /**< Buffer size for receive. */
extern const pj_uint16_t PJ_SO_SNDBUF; /**< Buffer size for send. */
/*
* Flags to be specified in #pj_sock_recv, #pj_sock_send, etc.
*/
extern const int PJ_MSG_OOB; /**< Out-of-band messages. */
extern const int PJ_MSG_PEEK; /**< Peek, don't remove from buffer. */
extern const int PJ_MSG_DONTROUTE; /**< Don't route. */
/**
* Flag to be specified in #pj_sock_shutdown.
*/
typedef enum pj_socket_sd_type
{
PJ_SD_RECEIVE = 0, /**< No more receive. */
PJ_SHUT_RD = 0, /**< Alias for SD_RECEIVE. */
PJ_SD_SEND = 1, /**< No more sending. */
PJ_SHUT_WR = 1, /**< Alias for SD_SEND. */
PJ_SD_BOTH = 2, /**< No more send and receive. */
PJ_SHUT_RDWR = 2 /**< Alias for SD_BOTH. */
} pj_socket_sd_type;
/** Address to accept any incoming messages. */
#define PJ_INADDR_ANY ((pj_uint32_t)0)
/** Address indicating an error return */
#define PJ_INADDR_NONE ((pj_uint32_t)0xffffffff)
/** Address to send to all hosts. */
#define PJ_INADDR_BROADCAST ((pj_uint32_t)0xffffffff)
/**
* Maximum length specifiable by #pj_sock_listen().
* If the build system doesn't override this value, then the lowest
* denominator (five, in Win32 systems) will be used.
*/
#if !defined(PJ_SOMAXCONN)
# define PJ_SOMAXCONN 5
#endif
/**
* Constant for invalid socket returned by #pj_sock_socket() and
* #pj_sock_accept().
*/
#define PJ_INVALID_SOCKET (-1)
#undef s_addr
/**
* This structure describes Internet address.
*/
typedef struct pj_in_addr
{
pj_uint32_t s_addr; /**< The 32bit IP address. */
} pj_in_addr;
/**
* This structure describes Internet socket address.
* If PJ_SOCKADDR_HAS_LEN is not zero, then sin_zero_len member is added
* to this struct. As far the application is concerned, the value of
* this member will always be zero. Internally, PJLIB may modify the value
* before calling OS socket API, and reset the value back to zero before
* returning the struct to application.
*/
struct pj_sockaddr_in
{
#if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0
pj_uint8_t sin_zero_len; /**< Just ignore this. */
pj_uint8_t sin_family; /**< Address family. */
#else
pj_uint16_t sin_family; /**< Address family. */
#endif
pj_uint16_t sin_port; /**< Transport layer port number. */
pj_in_addr sin_addr; /**< IP address. */
char sin_zero[8]; /**< Padding. */
};
#undef s6_addr
/**
* This structure describes IPv6 address.
*/
typedef struct pj_in6_addr
{
/** Union of address formats. */
union {
pj_uint8_t u6_addr8[16]; /**< u6_addr8 */
pj_uint16_t u6_addr16[8]; /**< u6_addr16 */
pj_uint32_t u6_addr32[4]; /**< u6_addr32 */
} in6_u;
/** Shortcut to access in6_u.u6_addr8. */
#define s6_addr in6_u.u6_addr8
/** Shortcut to access in6_u.u6_addr16. */
#define s6_addr16 in6_u.u6_addr16
/** Shortcut to access in6_u.u6_addr32. */
#define s6_addr32 in6_u.u6_addr32
} pj_in6_addr;
/** Initializer value for pj_in6_addr. */
#define PJ_IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } }
/** Initializer value for pj_in6_addr. */
#define PJ_IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } }
/**
* This structure describes IPv6 socket address.
* If PJ_SOCKADDR_HAS_LEN is not zero, then sin_zero_len member is added
* to this struct. As far the application is concerned, the value of
* this member will always be zero. Internally, PJLIB may modify the value
* before calling OS socket API, and reset the value back to zero before
* returning the struct to application.
*/
typedef struct pj_sockaddr_in6
{
#if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0
pj_uint8_t sin_zero_len; /**< Just ignore this. */
pj_uint8_t sin_family; /**< Address family. */
#else
pj_uint16_t sin6_family; /**< Address family */
#endif
pj_uint16_t sin6_port; /**< Transport layer port number. */
pj_uint32_t sin6_flowinfo; /**< IPv6 flow information */
pj_in6_addr sin6_addr; /**< IPv6 address. */
pj_uint32_t sin6_scope_id; /**< IPv6 scope-id */
} pj_sockaddr_in6;
/**
* This structure describes common attributes found in transport addresses.
* If PJ_SOCKADDR_HAS_LEN is not zero, then sa_zero_len member is added
* to this struct. As far the application is concerned, the value of
* this member will always be zero. Internally, PJLIB may modify the value
* before calling OS socket API, and reset the value back to zero before
* returning the struct to application.
*/
typedef struct pj_addr_hdr
{
#if defined(PJ_SOCKADDR_HAS_LEN) && PJ_SOCKADDR_HAS_LEN!=0
pj_uint8_t sa_zero_len;
pj_uint8_t sa_family;
#else
pj_uint16_t sa_family; /**< Common data: address family. */
#endif
} pj_addr_hdr;
/**
* This union describes a generic socket address.
*/
typedef union pj_sockaddr
{
pj_addr_hdr addr; /**< Generic transport address. */
pj_sockaddr_in ipv4; /**< IPv4 transport address. */
pj_sockaddr_in6 ipv6; /**< IPv6 transport address. */
} pj_sockaddr;
/*****************************************************************************
*
* SOCKET ADDRESS MANIPULATION.
*
*****************************************************************************
*/
/**
* Convert 16-bit value from network byte order to host byte order.
*
* @param netshort 16-bit network value.
* @return 16-bit host value.
*/
PJ_DECL(pj_uint16_t) pj_ntohs(pj_uint16_t netshort);
/**
* Convert 16-bit value from host byte order to network byte order.
*
* @param hostshort 16-bit host value.
* @return 16-bit network value.
*/
PJ_DECL(pj_uint16_t) pj_htons(pj_uint16_t hostshort);
/**
* Convert 32-bit value from network byte order to host byte order.
*
* @param netlong 32-bit network value.
* @return 32-bit host value.
*/
PJ_DECL(pj_uint32_t) pj_ntohl(pj_uint32_t netlong);
/**
* Convert 32-bit value from host byte order to network byte order.
*
* @param hostlong 32-bit host value.
* @return 32-bit network value.
*/
PJ_DECL(pj_uint32_t) pj_htonl(pj_uint32_t hostlong);
/**
* Convert an Internet host address given in network byte order
* to string in standard numbers and dots notation.
*
* @param inaddr The host address.
* @return The string address.
*/
PJ_DECL(char*) pj_inet_ntoa(pj_in_addr inaddr);
/**
* This function converts the Internet host address cp from the standard
* numbers-and-dots notation into binary data and stores it in the structure
* that inp points to.
*
* @param cp IP address in standard numbers-and-dots notation.
* @param inp Structure that holds the output of the conversion.
*
* @return nonzero if the address is valid, zero if not.
*/
PJ_DECL(int) pj_inet_aton(const pj_str_t *cp, struct pj_in_addr *inp);
/**
* Convert address string with numbers and dots to binary IP address.
*
* @param cp The IP address in numbers and dots notation.
* @return If success, the IP address is returned in network
* byte order. If failed, PJ_INADDR_NONE will be
* returned.
* @remark
* This is an obsolete interface to #pj_inet_aton(); it is obsolete
* because -1 is a valid address (255.255.255.255), and #pj_inet_aton()
* provides a cleaner way to indicate error return.
*/
PJ_DECL(pj_in_addr) pj_inet_addr(const pj_str_t *cp);
/**
* Convert address string with numbers and dots to binary IP address.
*
* @param cp The IP address in numbers and dots notation.
* @return If success, the IP address is returned in network
* byte order. If failed, PJ_INADDR_NONE will be
* returned.
* @remark
* This is an obsolete interface to #pj_inet_aton(); it is obsolete
* because -1 is a valid address (255.255.255.255), and #pj_inet_aton()
* provides a cleaner way to indicate error return.
*/
PJ_DECL(pj_in_addr) pj_inet_addr2(const char *cp);
/**
* Get the transport layer port number of an Internet socket address.
* The port is returned in host byte order.
*
* @param addr The IP socket address.
* @return Port number, in host byte order.
*/
PJ_INLINE(pj_uint16_t) pj_sockaddr_in_get_port(const pj_sockaddr_in *addr)
{
return pj_ntohs(addr->sin_port);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -