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

📄 stun.h

📁 最新的linux平台下SIP可视通信代码。
💻 H
字号:
 /*  The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack.  Copyright (C) 2001  Simon MORLAT simon.morlat@linphone.org  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*//* ==================================================================== * The Vovida Software License, Version 1.0  *  * Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: *  * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. *  * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. *  * 3. The names "VOCAL", "Vovida Open Communication Application Library", *    and "Vovida Open Communication Application Library (VOCAL)" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact vocal@vovida.org. * * 4. Products derived from this software may not be called "VOCAL", nor *    may "VOCAL" appear in their name, without prior written *    permission of Vovida Networks, Inc. *  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND * NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES * IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *  * ==================================================================== *  * This software consists of voluntary contributions made by Vovida * Networks, Inc. and many individuals on behalf of Vovida Networks, * Inc.  For more information on Vovida Networks, Inc., please see * <http://www.vovida.org/>. * */#ifndef __STUN_H__#define __STUN_H__#include <stdio.h>#include <time.h>#include <ortp/port.h>#include <ortp/stun_udp.h>#ifdef __cplusplusextern "C"{#endif/* if you change this version, change in makefile too  */#define STUN_VERSION "0.99"#define STUN_MAX_STRING 256#define STUN_MAX_UNKNOWN_ATTRIBUTES 8#define STUN_MAX_MESSAGE_SIZE 2048#define STUN_PORT 3478/* define some basic types */typedef unsigned char  UInt8;typedef unsigned short UInt16;typedef unsigned int   UInt32;#if	defined(WIN32) || defined(_WIN32_WCE)typedef unsigned __int64 UInt64;#elsetypedef unsigned long long UInt64;#endiftypedef struct { unsigned char octet[12]; }  UInt96;/* define a structure to hold a stun address  */#define  IPv4Family  0x01#define  IPv6Family  0x02/* define  flags  */#define ChangeIpFlag    0x04#define ChangePortFlag  0x02/* define  stun attribute */#define SA_MAPPEDADDRESS     0x0001#define SA_RESPONSEADDRESS   0x0002 /** deprecated **/#define SA_CHANGEREQUEST     0x0003 /** deprecated **/#define SA_SOURCEADDRESS     0x0004 /** deprecated **/#define SA_CHANGEDADDRESS    0x0005 /** deprecated **/#define SA_USERNAME          0x0006#define SA_PASSWORD          0x0007  /** deprecated **/#define SA_MESSAGEINTEGRITY  0x0008#define SA_ERRORCODE         0x0009#define SA_UNKNOWNATTRIBUTE  0x000A#define SA_REFLECTEDFROM     0x000B /** deprecated **/#define SA_REALM             0x0014
#define SA_NONCE             0x0015#define SA_XORMAPPEDADDRESS  0x0020#define SA_XORMAPPEDADDRESS2 0x8020 /* Non standard extention */#define SA_XORONLY           0x0021 /* deprecated */#define SA_SECONDARYADDRESS  0x0050 /* Non standard extention */#define SA_SOFTWARE          0x8022
#define SA_ALTERNATESERVER   0x8023
#define SA_FINGERPRINT       0x8028/* define turn attribute */#define TA_CHANNELNUMBER       0x000C
#define TA_LIFETIME            0x000D
#define TA_DEPRECATEDBANDWIDTH 0x0010
#define TA_XORPEERADDRESS      0x0012
#define TA_DATA                0x0013
#define TA_XORRELAYEDADDRESS   0x0016
#define TA_EVENPORT            0x0018
#define TA_REQUESTEDTRANSPORT  0x0019
#define TA_DONTFRAGMENT        0x001A
#define TA_DEPRECATEDTIMERVAL  0x0021
#define TA_RESERVATIONTOKEN    0x0022#define ICEA_PRIORITY          0x0024
#define ICEA_USECANDIDATE      0x0025
#define ICEA_ICECONTROLLED     0x8029
#define ICEA_ICECONTROLLING    0x802a
#define STUN_REQUEST           0x0000#define STUN_INDICATION        0x0010#define STUN_SUCCESS_RESP      0x0100#define STUN_ERR_RESP          0x0110#define STUN_IS_REQUEST(msg_type)       (((msg_type) & 0x0110) == 0x0000)
#define STUN_IS_INDICATION(msg_type)    (((msg_type) & 0x0110) == 0x0010)
#define STUN_IS_SUCCESS_RESP(msg_type)  (((msg_type) & 0x0110) == 0x0100)
#define STUN_IS_ERR_RESP(msg_type)      (((msg_type) & 0x0110) == 0x0110)
/* define types for a stun message */#define STUN_METHOD_BINDING           0x0001#define TURN_MEDHOD_ALLOCATE          0x0003 //(only request/response semantics defined)
#define TURN_METHOD_REFRESH           0x0004 //(only request/response semantics defined)
#define TURN_METHOD_CREATEPERMISSION  0x0008 //(only request/response semantics defined
#define TURN_METHOD_CHANNELBIND       0x0009 //(only request/response semantics defined)
//#define BindResponseMsg               0x0101//#define BindErrorResponseMsg          0x0111#define SharedSecretRequestMsg        0x0002#define SharedSecretResponseMsg       0x0102#define SharedSecretErrorResponseMsg  0x0112#define TURN_INDICATION_SEND          0x0006 //(only indication semantics defined)
#define TURN_INDICATION_DATA          0x0007 //(only indication semantics defined)
typedef struct {      UInt16 msgType;      UInt16 msgLength;      UInt32 magic_cookie;      UInt96 tr_id;} StunMsgHdr;typedef struct{      UInt16 type;      UInt16 length;} StunAtrHdr;typedef struct{      UInt16 port;      UInt32 addr;} StunAddress4;typedef struct{      UInt8 pad;      UInt8 family;      StunAddress4 ipv4;} StunAtrAddress4;typedef struct{      UInt32 value;} StunAtrChangeRequest;typedef struct{      UInt16 pad; /* all 0 */      UInt8 errorClass;      UInt8 number;      char reason[STUN_MAX_STRING];      UInt16 sizeReason;} StunAtrError;typedef struct{      UInt16 attrType[STUN_MAX_UNKNOWN_ATTRIBUTES];      UInt16 numAttributes;} StunAtrUnknown;typedef struct{      UInt16 channelNumber;      UInt16 rffu; /* Reserved For Future Use */} TurnAtrChannelNumber;typedef struct{      UInt32 lifetime;} TurnAtrLifetime;typedef struct{      char value[1500];            UInt16 sizeValue;} TurnAtrData;typedef struct{      UInt8 proto;      UInt8 pad1;      UInt8 pad2;      UInt8 pad3;} TurnAtrRequestedTransport;typedef struct{      UInt64 value;} TurnAtrReservationToken;typedef struct{      UInt32 fingerprint;} StunAtrFingerprint;typedef struct{      char value[STUN_MAX_STRING];            UInt16 sizeValue;} StunAtrString;typedef struct{      UInt32 priority;} IceAtrPriority;typedef struct{      UInt64 value;} IceAtrIceControll;typedef struct{      char hash[20];} StunAtrIntegrity;typedef enum {   HmacUnkown=0,   HmacOK,   HmacBadUserName,   HmacUnkownUserName,   HmacFailed} StunHmacStatus;typedef struct{      UInt16 attrType[STUN_MAX_UNKNOWN_ATTRIBUTES];      UInt16 numAttributes;} TurnAtrUnknown;typedef struct{      StunMsgHdr msgHdr;	      bool_t hasMappedAddress;      StunAtrAddress4  mappedAddress;	      bool_t hasResponseAddress;      StunAtrAddress4  responseAddress;	      bool_t hasChangeRequest;      StunAtrChangeRequest changeRequest;	      bool_t hasSourceAddress;      StunAtrAddress4 sourceAddress;	      bool_t hasChangedAddress;      StunAtrAddress4 changedAddress;	      bool_t hasUsername;      StunAtrString username;	      bool_t hasPassword;      StunAtrString password;	      bool_t hasMessageIntegrity;      StunAtrIntegrity messageIntegrity;	      bool_t hasErrorCode;      StunAtrError errorCode;	      bool_t hasUnknownAttributes;      StunAtrUnknown unknownAttributes;	      bool_t hasReflectedFrom;      StunAtrAddress4 reflectedFrom;      bool_t hasRealm;      StunAtrString realmName;      bool_t hasNonce;      StunAtrString nonceName;      bool_t hasXorMappedAddress;      StunAtrAddress4  xorMappedAddress;	      bool_t hasSoftware;      StunAtrString softwareName;      bool_t hasXorPeerAddress;      StunAtrAddress4 xorPeerAddress;      bool_t hasXorRelayedAddress;      StunAtrAddress4 xorRelayedAddress;      bool_t hasFingerprint;      StunAtrFingerprint fingerprint;      /* Turn elements */      bool_t hasChannelNumberAttributes;      TurnAtrChannelNumber channelNumberAttributes;      bool_t hasLifetimeAttributes;      TurnAtrLifetime lifetimeAttributes;      bool_t hasData;      TurnAtrData data;      bool_t hasRequestedTransport;      TurnAtrRequestedTransport requestedTransport;      bool_t hasDontFragment;      bool_t hasReservationToken;      TurnAtrReservationToken reservationToken;      bool_t hasPriority;      IceAtrPriority priority;      bool_t hasUseCandidate;      bool_t hasIceControlled;      IceAtrIceControll iceControlled;      bool_t hasIceControlling;      IceAtrIceControll iceControlling;} StunMessage; /* Define enum with different types of NAT */typedef enum {   StunTypeUnknown=0,   StunTypeOpen,   StunTypeConeNat,   StunTypeRestrictedNat,   StunTypePortRestrictedNat,   StunTypeSymNat,   StunTypeSymFirewall,   StunTypeBlocked,   StunTypeFailure} NatType;#define MAX_MEDIA_RELAYS 500#define MAX_RTP_MSG_SIZE 1500#define MEDIA_RELAY_TIMEOUT 3*60typedef struct {      int relayPort;       /* media relay port */      int fd;              /* media relay file descriptor */      StunAddress4 destination; /* NAT IP:port */      time_t expireTime;      /* if no activity after time, close the socket */} StunMediaRelay;typedef struct{      StunAddress4 myAddr;      StunAddress4 altAddr;      Socket myFd;      Socket altPortFd;      Socket altIpFd;      Socket altIpPortFd;      bool_t relay; /* true if media relaying is to be done */      StunMediaRelay relays[MAX_MEDIA_RELAYS];} StunServerInfo;voidstunCalculateIntegrity_longterm(char* hmac, const char* input, int length,                     const char *username, const char *realm, const char *password);voidstunCalculateIntegrity_shortterm(char* hmac, const char* input, int length, const char* key);UInt32stunCalculateFingerprint(const char* input, int length);bool_tstunParseMessage( char* buf,                   unsigned int bufLen,                   StunMessage *message);voidstunBuildReqSimple( StunMessage* msg,                    const StunAtrString *username,                    bool_t changePort, bool_t changeIp, unsigned int id );unsigned intstunEncodeMessage( const StunMessage *message,                    char* buf,                    unsigned int bufLen,                    const StunAtrString *password);voidstunCreateUserName(const StunAddress4 *addr, StunAtrString* username);void stunGetUserNameAndPassword(  const StunAddress4 *dest,                              StunAtrString* username,                             StunAtrString* password);voidstunCreatePassword(const StunAtrString *username, StunAtrString* password);int stunRand(void);UInt64stunGetSystemTimeSecs(void);/* find the IP address of a the specified stun server - return false is fails parse  */bool_t  stunParseServerName( const char* serverName, StunAddress4 *stunServerAddr);bool_t stunParseHostName( const char* peerName,                   UInt32 *ip,                   UInt16 *portVal,                   UInt16 defaultPort );/* return true if all is OK    Create a media relay and do the STERN thing if startMediaPort is non-zero */bool_tstunInitServer(StunServerInfo *info,                const StunAddress4 *myAddr,                const StunAddress4 *altAddr,               int startMediaPort);voidstunStopServer(StunServerInfo *info);/* returns number of address found - take array or addres */int stunFindLocalInterfaces(UInt32* addresses, int maxSize );int stunTest( StunAddress4 *dest, int testNum, StunAddress4* srcAddr, StunAddress4 *sMappedAddr, StunAddress4* sChangedAddr);NatTypestunNatType( StunAddress4 *dest,              bool_t* preservePort, /* if set, is return for if NAT preservers ports or not */             bool_t* hairpin ,  /* if set, is the return for if NAT will hairpin packets */             int port, /* port to use for the test, 0 to choose random port */             StunAddress4* sAddr /* NIC to use */   );bool_tstunServerProcessMsg( char* buf,                      unsigned int bufLen,                      StunAddress4 *from,                       StunAddress4 *myAddr,                      StunAddress4 *altAddr,                       StunMessage *resp,                      StunAddress4 *destination,                      StunAtrString *hmacPassword,                      bool_t* changePort,                      bool_t* changeIp);intstunOpenSocket( StunAddress4 *dest,                 StunAddress4* mappedAddr,                 int port,                 StunAddress4* srcAddr);bool_tstunOpenSocketPair(StunAddress4 *dest,                   StunAddress4* mapAddr_rtp,                    StunAddress4* mapAddr_rtcp,                    int* fd1, int* fd2,                    int srcPort,  StunAddress4* srcAddr);bool_tturnAllocateSocketPair(StunAddress4 *dest,                   StunAddress4* mapAddr_rtp,                    StunAddress4* mapAddr_rtcp,                    int* fd1, int* fd2,                    int srcPort,  StunAddress4* srcAddr);#ifdef __cplusplus}#endif#endif

⌨️ 快捷键说明

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