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

📄 stun.h

📁 sip 开源代码 源于novell sip 开源代码 源于novell
💻 H
字号:
#ifndef STUN_H#define STUN_H#include <iostream>#include <time.h>#include "udp.h"// if you change this version, change in makefile too #define STUN_VERSION "0.94"#define STUN_MAX_STRING 256#define STUN_MAX_UNKNOWN_ATTRIBUTES 8#define STUN_MAX_MESSAGE_SIZE 2048#define STUN_PORT 3478// define some basic typestypedef unsigned char  UInt8;typedef unsigned short UInt16;typedef unsigned int   UInt32;#if defined( WIN32 )typedef unsigned __int64 UInt64;#elsetypedef unsigned long long UInt64;#endiftypedef struct { unsigned char octet[16]; }  UInt128;/// define a structure to hold a stun address const UInt8  IPv4Family = 0x01;const UInt8  IPv6Family = 0x02;// define  flags  const UInt32 ChangeIpFlag   = 0x04;const UInt32 ChangePortFlag = 0x02;// define  stun attributeconst UInt16 MappedAddress    = 0x0001;const UInt16 ResponseAddress  = 0x0002;const UInt16 ChangeRequest    = 0x0003;const UInt16 SourceAddress    = 0x0004;const UInt16 ChangedAddress   = 0x0005;const UInt16 Username         = 0x0006;const UInt16 Password         = 0x0007;const UInt16 MessageIntegrity = 0x0008;const UInt16 ErrorCode        = 0x0009;const UInt16 UnknownAttribute = 0x000A;const UInt16 ReflectedFrom    = 0x000B;const UInt16 XorMappedAddress = 0x0020;const UInt16 XorOnly          = 0x0021;const UInt16 ServerName       = 0x0022;const UInt16 SecondaryAddress = 0x0050; // Non standard extention// define types for a stun message const UInt16 BindRequestMsg               = 0x0001;const UInt16 BindResponseMsg              = 0x0101;const UInt16 BindErrorResponseMsg         = 0x0111;const UInt16 SharedSecretRequestMsg       = 0x0002;const UInt16 SharedSecretResponseMsg      = 0x0102;const UInt16 SharedSecretErrorResponseMsg = 0x0112;typedef struct {      UInt16 msgType;      UInt16 msgLength;      UInt128 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{      char value[STUN_MAX_STRING];            UInt16 sizeValue;} StunAtrString;typedef struct{      char hash[20];} StunAtrIntegrity;typedef enum {   HmacUnkown=0,   HmacOK,   HmacBadUserName,   HmacUnkownUserName,   HmacFailed,} StunHmacStatus;typedef struct{      StunMsgHdr msgHdr;	      bool hasMappedAddress;      StunAtrAddress4  mappedAddress;	      bool hasResponseAddress;      StunAtrAddress4  responseAddress;	      bool hasChangeRequest;      StunAtrChangeRequest changeRequest;	      bool hasSourceAddress;      StunAtrAddress4 sourceAddress;	      bool hasChangedAddress;      StunAtrAddress4 changedAddress;	      bool hasUsername;      StunAtrString username;	      bool hasPassword;      StunAtrString password;	      bool hasMessageIntegrity;      StunAtrIntegrity messageIntegrity;	      bool hasErrorCode;      StunAtrError errorCode;	      bool hasUnknownAttributes;      StunAtrUnknown unknownAttributes;	      bool hasReflectedFrom;      StunAtrAddress4 reflectedFrom;      bool hasXorMappedAddress;      StunAtrAddress4  xorMappedAddress;	      bool xorOnly;      bool hasServerName;      StunAtrString serverName;            bool hasSecondaryAddress;      StunAtrAddress4 secondaryAddress;} StunMessage; // Define enum with different types of NAT typedef enum {   StunTypeUnknown=0,   StunTypeOpen,   StunTypeConeNat,   StunTypeRestrictedNat,   StunTypePortRestrictedNat,   StunTypeSymNat,   StunTypeSymFirewall,   StunTypeBlocked,   StunTypeFailure} NatType;#ifdef WIN32typedef SOCKET Socket;#else#endif#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 relay; // true if media relaying is to be done      StunMediaRelay relays[MAX_MEDIA_RELAYS];} StunServerInfo;boolstunParseMessage( char* buf,                   unsigned int bufLen,                   StunMessage& message,                   bool verbose );voidstunBuildReqSimple( StunMessage* msg,                    const StunAtrString& username,                    bool changePort, bool changeIp, unsigned int id=0 );unsigned intstunEncodeMessage( const StunMessage& message,                    char* buf,                    unsigned int bufLen,                    const StunAtrString& password,                   bool verbose);voidstunCreateUserName(const StunAddress4& addr, StunAtrString* username);void stunGetUserNameAndPassword(  const StunAddress4& dest,                              StunAtrString* username,                             StunAtrString* password);voidstunCreatePassword(const StunAtrString& username, StunAtrString* password);int stunRand();UInt64stunGetSystemTimeSecs();/// find the IP address of a the specified stun server - return false is fails parse bool  stunParseServerName( char* serverName, StunAddress4& stunServerAddr);bool stunParseHostName( 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-zeroboolstunInitServer(StunServerInfo& info,                const StunAddress4& myAddr,                const StunAddress4& altAddr,               int startMediaPort,               bool verbose);voidstunStopServer(StunServerInfo& info);/// return true if all is OK boolstunServerProcess(StunServerInfo& info, bool verbose);/// returns number of address found - take array or addres int stunFindLocalInterfaces(UInt32* addresses, int maxSize );void stunTest( StunAddress4& dest, int testNum, bool verbose, StunAddress4* srcAddr=0 );NatTypestunNatType( StunAddress4& dest, bool verbose,              bool* preservePort=0, // if set, is return for if NAT preservers ports or not             bool* hairpin=0 ,  // if set, is the return for if NAT will hairpin packets             int port=0, // port to use for the test, 0 to choose random port             StunAddress4* sAddr=0 // NIC to use    );/// prints a StunAddressstd::ostream& operator<<( std::ostream& strm, const StunAddress4& addr);std::ostream& operator<< ( std::ostream& strm, const UInt128& );boolstunServerProcessMsg( char* buf,                      unsigned int bufLen,                      StunAddress4& from,                       StunAddress4& myAddr,                      StunAddress4& altAddr,                       StunMessage* resp,                      StunAddress4* destination,                      StunAtrString* hmacPassword,                      bool* changePort,                      bool* changeIp,                      bool verbose);intstunOpenSocket( StunAddress4& dest,                 StunAddress4* mappedAddr,                 int port=0,                 StunAddress4* srcAddr=0,                 bool verbose=false );boolstunOpenSocketPair( StunAddress4& dest, StunAddress4* mappedAddr,                     int* fd1, int* fd2,                     int srcPort=0,  StunAddress4* srcAddr=0,                    bool verbose=false);#endif/* ==================================================================== * 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/>. * */// Local Variables:// mode:c++// c-file-style:"ellemtel"// c-file-offsets:((case-label . +))// indent-tabs-mode:nil// End:

⌨️ 快捷键说明

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