⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 su.h

📁 sip协议栈
💻 H
字号:
/* * This file is part of the Sofia-SIP package * * Copyright (C) 2005 Nokia Corporation. * * Contact: Pekka Pessi <pekka.pessi@nokia.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * */#ifndef SU_H/** Defined when <sofia-sip/su.h> has been included. */#define SU_H/**@ingroup su_socket  * @file sofia-sip/su.h Socket and network address interface * * @author Pekka Pessi <Pekka.Pessi@nokia.com> *  * @date Created: Thu Mar 18 19:40:51 1999 pessi *//* ---------------------------------------------------------------------- *//* Includes */#ifndef SU_CONFIG_H#include "sofia-sip/su_config.h"#endif#ifndef SU_TYPES_H#include "sofia-sip/su_types.h"#endif#ifndef SU_ERRNO_H#include <sofia-sip/su_errno.h>#endif#include <stdio.h>SOFIA_BEGIN_DECLS#if SU_HAVE_BSDSOCK		/* Unix-compatible includes */#include <errno.h>#include <unistd.h>#include <limits.h>#include <fcntl.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#endif#if SU_HAVE_WINSOCK		/* Windows includes */#  include <winsock2.h>#  include <ws2tcpip.h>static __inlineuint16_t su_ntohs(uint16_t s){  return (uint16_t)(((s & 255) << 8) | ((s & 0xff00) >> 8));}static __inlineuint32_t su_ntohl(uint32_t l){  return ((l & 0xff) << 24) | ((l & 0xff00) << 8)       | ((l & 0xff0000) >> 8) | ((l & 0xff000000U) >> 24);}#define ntohs su_ntohs#define htons su_ntohs#define ntohl su_ntohl#define htonl su_ntohl#  if defined(IPPROTO_IPV6)/* IPv6 defined in ws2tcpip.h */#  elif SU_HAVE_IN6 #    include <tpipv6.h>		/* From "IPv6 Tech Preview"  */#  else#    error Winsock with IPv6 support required#  endif#include <limits.h>#endif/* ---------------------------------------------------------------------- *//* Constant definitions */#if SU_HAVE_BSDSOCK || DOCUMENTATION_ONLYenum {  /** Invalid socket descriptor */   INVALID_SOCKET = -1,  /** Error from su_socket() call */  SOCKET_ERROR = -1,  /** Return code for a successful call */  su_success = 0,   /** Return code for an unsuccessful call */  su_failure = -1};#elif SU_HAVE_WINSOCKenum {   su_success = 0,   su_failure = 0xffffffffUL };#define MSG_NOSIGNAL (0)#endif/**@HI Maximum size of host name. */#define SU_MAXHOST (1025)/**@HI Maximum size of service name. */#define SU_MAXSERV (25)/**@HI Maximum size of address in text format. */#define SU_ADDRSIZE (48)/**@HI Maximum size of port number in text format. */#define SU_SERVSIZE (16)#define SU_SUCCESS su_success#define SU_FAILURE su_failure/* ---------------------------------------------------------------------- *//* Type definitions *//** Socket descriptor type. */#if SU_HAVE_BSDSOCK || DOCUMENTATION_ONLYtypedef int su_socket_t;#elif SU_HAVE_WINSOCKtypedef SOCKET su_socket_t;#endif#if !SU_HAVE_SOCKADDR_STORAGE/* * RFC 2553: protocol-independent placeholder for socket addresses */#define _SS_MAXSIZE	128#define _SS_ALIGNSIZE	(sizeof(int64_t))#define _SS_PAD1SIZE	(_SS_ALIGNSIZE - sizeof(u_char) * 2)#define _SS_PAD2SIZE	(_SS_MAXSIZE - sizeof(u_char) * 2 - \				_SS_PAD1SIZE - _SS_ALIGNSIZE)struct sockaddr_storage {#if SU_HAVE_SOCKADDR_SA_LEN	unsigned char ss_len;		/* address length */	unsigned char ss_family;	/* address family */#else	unsigned short ss_family;	/* address family */#endif	char	__ss_pad1[_SS_PAD1SIZE];	int64_t __ss_align;	/* force desired structure storage alignment */	char	__ss_pad2[_SS_PAD2SIZE];};#endif/** Common socket address structure. */union su_sockaddr_u {#ifdef DOCUMENTATION_ONLY  uint8_t             su_len;         /**< Length of structure */  uint8_t             su_family;      /**< Address family. */  uint16_t            su_port;        /**< Port number. */#else  short               su_dummy;	      /**< Dummy member to initialize */#if SU_HAVE_SOCKADDR_SA_LEN#define               su_len          su_sa.sa_len#define               su_family       su_sa.sa_family#else#define               su_len          su_array[0]  short               su_family;#endif#define               su_port         su_sin.sin_port  #endif  char                su_array[32];   /**< Presented as chars */  uint16_t            su_array16[16]; /**< Presented as 16-bit ints */  uint32_t            su_array32[8];  /**< Presented as 32-bit ints */  struct sockaddr     su_sa;          /**< Address in struct sockaddr format */  struct sockaddr_in  su_sin;         /**< Address in IPv4 format */#if SU_HAVE_IN6  struct sockaddr_in6 su_sin6;        /**< Address in IPv6 format */#endif#ifdef DOCUMENTATION_ONLY  uint32_t            su_scope_id;    /**< Scope ID. */#else#define               su_scope_id     su_array32[6]#endif};typedef union su_sockaddr_u su_sockaddr_t;#if SU_HAVE_BSDSOCK || DOCUMENTATION_ONLY/** IO vector for su_vsend() and su_vrecv().  * @note Ordering of the fields is reversed on Windows. */struct su_iovec_s {  void  *siv_base;		/**< Pointer to buffer. */  size_t siv_len;		/**< Size of buffer.  */};#endif#if SU_HAVE_WINSOCKstruct su_iovec_s {  long  siv_len;  void *siv_base;};#endif/** I/O vector for scatter-gather I/O. */typedef struct su_iovec_s   su_iovec_t;/* ---------------------------------------------------------------------- *//* Socket compatibility functions */SOFIAPUBFUN int su_init(void);SOFIAPUBFUN void su_deinit(void);/** Create an endpoint for communication. */SOFIAPUBFUN su_socket_t su_socket(int af, int sock, int proto);/** Close an socket descriptor. */SOFIAPUBFUN int su_close(su_socket_t s);/** Control socket. */SOFIAPUBFUN int su_ioctl(su_socket_t s, int request, ...);/** Checks if the previous call failed because it would have blocked. */SOFIAPUBFUN int su_isblocking(void);/** Set/reset blocking option. */ SOFIAPUBFUN int su_setblocking(su_socket_t s, int blocking);/** Set/reset address reusing option. */SOFIAPUBFUN int su_setreuseaddr(su_socket_t s, int reuse);/** Get the error code associated with the socket. */SOFIAPUBFUN int su_soerror(su_socket_t s);/** Get size of message available in socket. */SOFIAPUBFUN int su_getmsgsize(su_socket_t s);/** Scatter-gather send. */SOFIAPUBFUNint su_vsend(su_socket_t s, su_iovec_t const iov[], int iovlen, int flags,              su_sockaddr_t const *su, socklen_t sulen);/** Scatter-gather receive. */SOFIAPUBFUNint su_vrecv(su_socket_t s, su_iovec_t iov[], int iovlen, int flags,              su_sockaddr_t *su, socklen_t *sulen);/** Return local IP address */SOFIAPUBFUN int su_getlocalip(su_sockaddr_t *sin);#include <sofia-sip/su_addrinfo.h>#if SU_HAVE_BSDSOCK#define su_ioctl  ioctl#define su_isblocking() (su_errno() == EAGAIN || su_errno() == EWOULDBLOCK)#endif#if SU_HAVE_WINSOCKSOFIAPUBFUN int inet_pton(int af, char const *src, void *dst);SOFIAPUBFUN const char *inet_ntop(int af, void const *src,				  char *dst, size_t size);#endif/* ---------------------------------------------------------------------- *//* Other compatibility stuff */#if SU_HAVE_WINSOCK#define getuid() (0x505)#endif#ifndef IPPROTO_SCTP#define IPPROTO_SCTP (132)#endif/* ---------------------------------------------------------------------- *//* Address manipulation macros *//**@HI Get pointer to address field. * * The macro SU_ADDR() returns pointer to the address field (sin_data, * sin_addr or sin_addr6, depending on the address family). */#if SU_HAVE_IN6#define SU_ADDR(su) \  ((su)->su_family == AF_INET ? (void *)&(su)->su_sin.sin_addr : \  ((su)->su_family == AF_INET6 ? (void *)&(su)->su_sin6.sin6_addr : \  (void *)&(su)->su_sa.sa_data))#else#define SU_ADDR(su) \  ((su)->su_family == AF_INET ? (void *)&(su)->su_sin.sin_addr : \  (void *)&(su)->su_sa.sa_data)#endif/**@HI Get length of address field. * * The macro SU_ADDRLEN() returns length of the address field (sin_data, * sin_addr or sin_addr6, depending on the address family). */#if SU_HAVE_IN6#define SU_ADDRLEN(su) \  ((su)->su_family == AF_INET ? sizeof((su)->su_sin.sin_addr) :	    \   ((su)->su_family == AF_INET6 ? sizeof((su)->su_sin6.sin6_addr) : \    sizeof((su)->su_sa.sa_data)))#else#define SU_ADDRLEN(su) \  ((su)->su_family == AF_INET ? sizeof((su)->su_sin.sin_addr) :	    \   sizeof((su)->su_sa.sa_data))#endif/**@HI Test if su_sockaddr_t is INADDR_ANY or IN6ADDR_ANY. */#if SU_HAVE_IN6#define SU_HAS_INADDR_ANY(su) \  ((su)->su_family == AF_INET \   ? ((su)->su_sin.sin_addr.s_addr == INADDR_ANY) \   : ((su)->su_family == AF_INET6 \      ? (memcmp(&(su)->su_sin6.sin6_addr, su_in6addr_any(), \		sizeof(*su_in6addr_any())) == 0) : 0))#else#define SU_HAS_INADDR_ANY(su) \  ((su)->su_family == AF_INET \  ? ((su)->su_sin.sin_addr.s_addr == INADDR_ANY) : 0)#endif#define SU_SOCKADDR_INADDR_ANY(su) SU_HAS_INADDR_ANY(su)/**@HI Calculate correct size of su_sockaddr_t structure. */ #if SU_HAVE_IN6#define SU_SOCKADDR_SIZE(su) \  ((su)->su_family == AF_INET ? sizeof((su)->su_sin) \   : ((su)->su_family == AF_INET6 ? sizeof((su)->su_sin6) \      : sizeof(*su)))#else#define SU_SOCKADDR_SIZE(su) \  ((su)->su_family == AF_INET ? sizeof((su)->su_sin) \    : sizeof(*su))#endif#define su_sockaddr_size SU_SOCKADDR_SIZE#if SU_HAVE_IN6#if SU_HAVE_BSDSOCK#define su_in6addr_any()         (&in6addr_any)#define su_in6addr_loopback()    (&in6addr_loopback)#define SU_IN6ADDR_ANY_INIT      IN6ADDR_ANY_INIT#define SU_IN6ADDR_LOOPBACK_INIT IN6ADDR_LOOPBACK_INIT#endif#if SU_HAVE_WINSOCK || DOCUMENTATION_ONLYSOFIAPUBVAR const struct in_addr6 *su_in6addr_any(void);SOFIAPUBVAR const struct in_addr6 *su_in6addr_loopback(void);#define SU_IN6ADDR_ANY_INIT      { 0 }#define SU_IN6ADDR_LOOPBACK_INIT { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1 }#endif#endif /* SU_HAVE_IN6 */SOFIAPUBFUN int su_cmp_sockaddr(su_sockaddr_t const *a,				su_sockaddr_t const *b);SOFIAPUBFUN int su_match_sockaddr(su_sockaddr_t const *a,				  su_sockaddr_t const *b);SOFIAPUBFUN void su_canonize_sockaddr(su_sockaddr_t *su);#if SU_HAVE_IN6#define SU_CANONIZE_SOCKADDR(su) \  ((su)->su_family == AF_INET6 ? su_canonize_sockaddr(su) : (void)0)#else#define SU_CANONIZE_SOCKADDR(su) \  ((void)0)#endifSOFIA_END_DECLS#endif /* !defined(SU_H) */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -