oochannels.c

来自「一个非常美妙的proxy。功能强大。基于sip的协议。如果还要的话」· C语言 代码 · 共 1,774 行 · 第 1/4 页

C
1,774
字号
/* * Copyright (C) 2004-2005 by Objective Systems, Inc. * * This software is furnished under an open source license and may be  * used and copied only in accordance with the terms of this license.  * The text of the license may generally be found in the root  * directory of this installation in the COPYING file.  It  * can also be viewed online at the following URL: * *   http://www.obj-sys.com/open/license.html * * Any redistributions of this file including modified versions must  * maintain this copyright notice. * *****************************************************************************/#include "ooports.h" #include "oochannels.h"#include "ootrace.h"#include "ooq931.h"#include "ooh245.h"#include "ooh323.h"#include "ooCalls.h"#include "printHandler.h"#include "ooGkClient.h"#include "stdio.h"#include "ooTimer.h"#include "ooh323ep.h"#include "ooStackCmds.h"#include "ooCmdChannel.h"#include "ootypes.h"/** Global endpoint structure */extern OOH323EndPoint gH323ep;extern DList g_TimerList;static OOBOOL gMonitor = FALSE;int ooCreateH245Listener(OOH323CallData *call){   int ret=0;   OOSOCKET channelSocket=0;   OOTRACEINFO1("Creating H245 listener\n");   if((ret=ooSocketCreate (&channelSocket))!=ASN_OK)   {      OOTRACEERR3("ERROR: Failed to create socket for H245 listener "                  "(%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   ret = ooBindPort (OOTCP, channelSocket, call->localIP);    if(ret == OO_FAILED)   {      OOTRACEERR3("Error:Unable to bind to a TCP port - H245 listener creation"                  " (%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   call->h245listenport = (int*) memAlloc(call->pctxt, sizeof(int));   *(call->h245listenport) = ret;   call->h245listener = (OOSOCKET*)memAlloc(call->pctxt, sizeof(OOSOCKET));   *(call->h245listener) = channelSocket;   ret = ooSocketListen(*(call->h245listener), 20);   if(ret != ASN_OK)   {      OOTRACEERR3("Error:Unable to listen on H.245 socket (%s, %s)\n",                    call->callType, call->callToken);      return OO_FAILED;   }      OOTRACEINFO4("H245 listener creation - successful(port %d) (%s, %s)\n",                 *(call->h245listenport),call->callType, call->callToken);   return OO_OK;}int ooCreateH245Connection(OOH323CallData *call){   int ret=0;   OOSOCKET channelSocket=0;   ooTimerCallback *cbData=NULL;   OOTRACEINFO1("Creating H245 Connection\n");   if((ret=ooSocketCreate (&channelSocket))!=ASN_OK)   {      OOTRACEERR3("ERROR:Failed to create socket for H245 connection "                  "(%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   else   {      if (0 == call->pH245Channel) {         call->pH245Channel = 	    (OOH323Channel*) memAllocZ (call->pctxt, sizeof(OOH323Channel));      }      /*         bind socket to a port before connecting. Thus avoiding         implicit bind done by a connect call.      */      ret = ooBindPort(OOTCP, channelSocket, call->localIP);       if(ret == OO_FAILED)      {         OOTRACEERR3("Error:Unable to bind to a TCP port - h245 connection "                     "(%s, %s)\n", call->callType, call->callToken);         return OO_FAILED;      }      call->pH245Channel->port = ret;      OOTRACEDBGC4("Local H.245 port is %d (%s, %s)\n", 		   call->pH245Channel->port,                   call->callType, call->callToken);      OOTRACEINFO5("Trying to connect to remote endpoint to setup H245 "                   "connection %s:%d(%s, %s)\n", call->remoteIP,                     call->remoteH245Port, call->callType, call->callToken);                    if((ret=ooSocketConnect(channelSocket, call->remoteIP,                              call->remoteH245Port))==ASN_OK)      {         call->pH245Channel->sock = channelSocket;         call->h245SessionState = OO_H245SESSION_ACTIVE;         OOTRACEINFO3("H245 connection creation succesful (%s, %s)\n",                      call->callType, call->callToken);         /*Start terminal capability exchange and master slave determination */         ret = ooSendTermCapMsg(call);         if(ret != OO_OK)         {            OOTRACEERR3("ERROR:Sending Terminal capability message (%s, %s)\n",                         call->callType, call->callToken);            return ret;         }         ret = ooSendMasterSlaveDetermination(call);         if(ret != OO_OK)         {            OOTRACEERR3("ERROR:Sending Master-slave determination message "                        "(%s, %s)\n", call->callType, call->callToken);            return ret;         }      }      else      {	 if(call->h245ConnectionAttempts >= 3)         {            OOTRACEERR3("Error:Failed to setup an H245 connection with remote "                        "destination. (%s, %s)\n", call->callType,                          call->callToken);            if(call->callState < OO_CALL_CLEAR)            {               call->callEndReason = OO_REASON_TRANSPORTFAILURE;               call->callState = OO_CALL_CLEAR;            }            return OO_FAILED;	 }         else{            OOTRACEWARN4("Warn:Failed to connect to remote destination for "                         "H245 connection - will retry after %d seconds"                         "(%s, %s)\n", DEFAULT_H245CONNECTION_RETRYTIMEOUT,                         call->callType, call->callToken);            cbData = (ooTimerCallback*) memAlloc(call->pctxt,                                                      sizeof(ooTimerCallback));            if(!cbData)            {               OOTRACEERR3("Error:Unable to allocate memory for timer "                           "callback.(%s, %s)\n", call->callType,                             call->callToken);               return OO_FAILED;            }            cbData->call = call;            cbData->timerType = OO_H245CONNECT_TIMER;            if(!ooTimerCreate(call->pctxt, &call->timerList,                               &ooCallH245ConnectionRetryTimerExpired,                               DEFAULT_H245CONNECTION_RETRYTIMEOUT, cbData,                               FALSE))            {               OOTRACEERR3("Error:Unable to create H245 connection retry timer"                           "(%s, %s)\n", call->callType, call->callToken);               memFreePtr(call->pctxt, cbData);               return OO_FAILED;            }            return OO_OK;         }      }   }   return OO_OK;}int ooSendH225Msg(OOH323CallData *call, Q931Message *msg){   int iRet=0;   ASN1OCTET * encodebuf;   if(!call)      return OO_FAILED;   encodebuf = (ASN1OCTET*) memAlloc (call->pctxt, MAXMSGLEN);   if(!encodebuf)   {      OOTRACEERR3("Error:Failed to allocate memory for encoding H225 "                  "message(%s, %s)\n", call->callType, call->callToken);      return OO_FAILED;   }   iRet = ooEncodeH225Message(call, msg, encodebuf, MAXMSGLEN);   if(iRet != OO_OK)   {      OOTRACEERR3("Error:Failed to encode H225 message. (%s, %s)\n", 		  call->callType, call->callToken);      memFreePtr (call->pctxt, encodebuf);      return OO_FAILED;   }   /* If high priority messages, send immediately.*/   if(encodebuf[0] == OOReleaseComplete ||       (encodebuf[0]==OOFacility && encodebuf[1]==OOEndSessionCommand))   {      dListFreeAll(call->pctxt, &call->pH225Channel->outQueue);      dListAppend (call->pctxt, &call->pH225Channel->outQueue, encodebuf);      // ooSendMsg(call, OOQ931MSG);   }else{      dListAppend (call->pctxt, &call->pH225Channel->outQueue, encodebuf);       OOTRACEDBGC4("Queued H225 messages %d. (%s, %s)\n",                                      call->pH225Channel->outQueue.count,                                      call->callType, call->callToken);     }   return OO_OK;}int ooCreateH225Connection(OOH323CallData *call){   int ret=0;   OOSOCKET channelSocket=0;   if((ret=ooSocketCreate (&channelSocket))!=ASN_OK)   {      OOTRACEERR3("Failed to create socket for transmit H2250 channel (%s, %s)"                  "\n", call->callType, call->callToken);      if(call->callState < OO_CALL_CLEAR)      {         call->callState = OO_CALL_CLEAR;         call->callEndReason = OO_REASON_TRANSPORTFAILURE;      }      return OO_FAILED;   }   else   {      /*         bind socket to a port before connecting. Thus avoiding         implicit bind done by a connect call. Avoided on windows as          windows sockets have problem in reusing the addresses even after         setting SO_REUSEADDR, hence in windows we just allow os to bind         to any random port.      */#ifndef _WIN32      ret = ooBindPort(OOTCP,channelSocket, call->localIP); #else      ret = ooBindOSAllocatedPort(channelSocket, call->localIP);#endif            if(ret == OO_FAILED)      {         OOTRACEERR3("Error:Unable to bind to a TCP port (%s, %s)\n",          call->callType, call->callToken);         if(call->callState < OO_CALL_CLEAR)         {            call->callState = OO_CALL_CLEAR;            call->callEndReason = OO_REASON_TRANSPORTFAILURE;         }         return OO_FAILED;      }      if (0 == call->pH225Channel) {	 call->pH225Channel = 	    (OOH323Channel*) memAllocZ (call->pctxt, sizeof(OOH323Channel));      }      call->pH225Channel->port = ret;      OOTRACEINFO5("Trying to connect to remote endpoint(%s:%d) to setup "                   "H2250 channel (%s, %s)\n", call->remoteIP,                    call->remotePort, call->callType, call->callToken);      if((ret=ooSocketConnect(channelSocket, call->remoteIP,                              call->remotePort))==ASN_OK)      {         call->pH225Channel->sock = channelSocket;         OOTRACEINFO3("H2250 transmiter channel creation - succesful "                      "(%s, %s)\n", call->callType, call->callToken);         /* If multihomed, get ip from socket */         if(!strcmp(call->localIP, "0.0.0.0"))         {            OOTRACEDBGA3("Determining ip address for outgoing call in "                         "multihomed mode. (%s, %s)\n", call->callType,                           call->callToken);            ret = ooSocketGetIpAndPort(channelSocket, call->localIP, 20,                                        &call->pH225Channel->port);            if(ret != ASN_OK)            {               OOTRACEERR3("Error:Failed to retrieve local ip and port from "                           "socket for multihomed mode.(%s, %s)\n",                             call->callType, call->callToken);               if(call->callState < OO_CALL_CLEAR)               {  /* transport failure */                  call->callState = OO_CALL_CLEAR;                  call->callEndReason = OO_REASON_TRANSPORTFAILURE;               }               return OO_FAILED;            }            OOTRACEDBGA4("Using local ip %s for outgoing call(multihomedMode)."                         " (%s, %s)\n", call->localIP, call->callType,                          call->callToken);         }         return OO_OK;      }      else      {         OOTRACEERR3("ERROR:Failed to connect to remote destination for "                    "transmit H2250 channel(%s, %s)\n",call->callType,                     call->callToken);         if(call->callState < OO_CALL_CLEAR)         {  /* No one is listening at remote end */            call->callState = OO_CALL_CLEAR;            call->callEndReason = OO_REASON_NOUSER;         }         return OO_FAILED;      }      return OO_FAILED;   }}int ooCloseH225Connection (OOH323CallData *call){   if (0 != call->pH225Channel)   {      if(call->pH225Channel->sock != 0)         ooSocketClose (call->pH225Channel->sock);      if (call->pH225Channel->outQueue.count > 0)      {         dListFreeAll (call->pctxt, &(call->pH225Channel->outQueue));      }      memFreePtr (call->pctxt, call->pH225Channel);      call->pH225Channel = NULL;   }   return OO_OK;}int ooCreateH323Listener(){   int ret=0;   OOSOCKET channelSocket=0;   OOIPADDR ipaddrs;    /* Create socket */   if((ret=ooSocketCreate (&channelSocket))!=ASN_OK)   {      OOTRACEERR1("Failed to create socket for H323 Listener\n");      return OO_FAILED;   }   ret= ooSocketStrToAddr (gH323ep.signallingIP, &ipaddrs);   if((ret=ooSocketBind (channelSocket, ipaddrs,                          gH323ep.listenPort))==ASN_OK)    {      gH323ep.listener = (OOSOCKET*)memAlloc(&gH323ep.ctxt,sizeof(OOSOCKET));      *(gH323ep.listener) = channelSocket;                ooSocketListen(channelSocket,20); /*listen on socket*/      OOTRACEINFO1("H323 listener creation - successful\n");      return OO_OK;   }   else   {      OOTRACEERR1("ERROR:Failed to create H323 listener\n");      return OO_FAILED;   }}int ooAcceptH225Connection()    {   OOH323CallData * call;   int ret;   char callToken[20];   OOSOCKET h225Channel=0;   ret = ooSocketAccept (*(gH323ep.listener), &h225Channel,                          NULL, NULL);   if(ret != ASN_OK)   {      OOTRACEERR1("Error:Accepting h225 connection\n");      return OO_FAILED;   }   ooGenerateCallToken(callToken, sizeof(callToken));   call = ooCreateCall("incoming", callToken);   if(!call)   {      OOTRACEERR1("ERROR:Failed to create an incoming call\n");      return OO_FAILED;   }   call->pH225Channel = (OOH323Channel*)       memAllocZ (call->pctxt, sizeof(OOH323Channel));   call->pH225Channel->sock = h225Channel;   /* If multihomed, get ip from socket */   if(!strcmp(call->localIP, "0.0.0.0"))   {      OOTRACEDBGA3("Determining IP address for incoming call in multihomed "                   "mode (%s, %s)\n", call->callType, call->callToken);      ret = ooSocketGetIpAndPort(h225Channel, call->localIP, 20,                                        &call->pH225Channel->port);      if(ret != ASN_OK)      {         OOTRACEERR3("Error:Failed to retrieve local ip and port from "                     "socket for multihomed mode.(%s, %s)\n",                       call->callType, call->callToken);         if(call->callState < OO_CALL_CLEAR)         {  /* transport failure */            call->callState = OO_CALL_CLEAR;            call->callEndReason = OO_REASON_TRANSPORTFAILURE;         }         return OO_FAILED;      }      OOTRACEDBGA4("Using Local IP address %s for incoming call in multihomed "                   "mode. (%s, %s)\n", call->localIP, call->callType,                     call->callToken);   }   return OO_OK;}int ooAcceptH245Connection(OOH323CallData *call){   int ret;   OOSOCKET h245Channel=0;   ret = ooSocketAccept (*(call->h245listener), &h245Channel,                          NULL, NULL);   if(ret != ASN_OK)   {      OOTRACEERR1("Error:Accepting h245 connection\n");      return OO_FAILED;

⌨️ 快捷键说明

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