📄 sock.h
字号:
/* $Id: sock.h 974 2007-02-19 01:13:53Z 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)/** * Structure describing a generic socket address. * 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_sockaddr{#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 char sa_data[14]; /**< Address data. */} pj_sockaddr;#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. */};/** * 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;/***************************************************************************** * * 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);}/** * Set the port number of an Internet socket address. * * @param addr The IP socket address. * @param hostport The port number, in host byte order. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -