?? sip_ctrl.c
字號:
#include "sip_util.h"#include "sip_ctrl.h"#include "sip_message.h"#include "sdp.h"#include "stack_if.h"#ifdef _WINDOWS#include<time.h>#endifextern SAVE_MSG g_SipMsg;extern STACK_INFO g_StackInfo;/* 瘦賂してあるメッセ〖ジを掐れ侖える */void save_message(char* msg, SAVE_MSG* s_msg){ strcpy(s_msg->save_beforMsg, s_msg->save_Msg); strcpy(s_msg->save_Msg,msg);}/* 判峽脫のREGISTERを侯喇し流慨する */int SendRegister(char* msg, char* username, char* serv_addr){ int ret; char hostname[MAX_NAME]; char* addrbuff; struct hostent* phost; struct hostent* psvrhost; struct in_addr iaddr; if(username == NULL){ debug("Error!!SendRegister failed.\n"); return -1; } g_StackInfo.state = eSRegister; g_StackInfo.seq = 1+RANDOM(10000); gethostname(hostname,MAX_NAME); phost = gethostbyname(hostname); /* 極眉瑣のユ〖ザ嘆、IPアドレスをFQDNに */ strcpy(g_StackInfo.fqdn, phost->h_name); addrbuff = inet_ntoa(*(struct in_addr*)phost->h_addr_list[0]); strcpy(g_StackInfo.addr, addrbuff); /* サ〖バのIPアドレスをFQDNに */ inet_aton(serv_addr, &iaddr); psvrhost = gethostbyaddr((char*)&iaddr, 4, AF_INET); if(psvrhost == NULL){ debug("SIP server name is not resolved by addr.\n"); return -1; } strcpy(g_StackInfo.serv_fqdn, psvrhost->h_name); /* スタ〖トライン */ ret = set_Startline(Method_Register, msg, g_StackInfo.serv_fqdn); if(ret<0){ debug("Error!!SendRegister set_Startline failed.\n"); return -1; } /* Via */ { char field[MAX_FIELD]; Make_Via(field, g_StackInfo.addr, g_StackInfo.seq); ret = set_Via(msg, field); if(ret<0){ debug("Error!!SendRegister set_Via failed.\n"); return -1; } } /* Max-Forwards */ ret = set_Maxforwards(msg, MAX_COUNT); if(ret<0){ debug("Error!!SendRegister set_Maxforwards failed.\n"); return -1; } /* FromとTo */ { char field[MAX_FIELD]; char fieldto[MAX_FIELD]; sprintf(field, "%s <sip:%s@%s>;tag=s%d" , g_StackInfo.username, g_StackInfo.username, g_StackInfo.fqdn, RANDOM(100000)); ret = set_From( msg, field); if(ret<0){ debug("Error!!SendRegister set_From failed.\n"); return -1; } sprintf(fieldto, "%s <sip:%s@%s>" , g_StackInfo.username, g_StackInfo.username, g_StackInfo.fqdn); ret = set_To( msg, fieldto); if(ret < 0) { debug("Error!!SendRegister set_To failed.\n"); return -1; } } /* Call-ID */ { char field[MAX_FIELD]; sprintf(field, "%d-%d-%d@%s", RANDOM(10000), RANDOM(10000), RANDOM(10000), g_StackInfo.fqdn); ret = set_CallID( msg, field); if(ret<0){ debug("Error!!SendRegister set_CallID failed.\n"); return -1; } } /* CSeq */ { char field[MAX_FIELD]; sprintf(field, "%d %s" , g_StackInfo.seq, METHOD_REGISTER); ret = set_CSeq( msg, field); if(ret<0){ debug("Error!!SendRegister set_CallID failed.\n"); return -1; } } /* Expires */ ret = set_Expires(msg, MAX_EXPIRES); if(ret<0){ debug("Error!!SendRegister set_Expires failed.\n"); return -1; } /* Contact */ { char field[MAX_FIELD]; memset(field, 0, MAX_FIELD); sprintf(field, "%s@%s", g_StackInfo.username, g_StackInfo.addr); ret = set_Contact(msg, field); if(ret<0){ debug("Error!!SendRegister set_Contact failed.\n"); return -1; } } /* Content-Length */ { ret = set_Contentlength(msg, 0); } printf("\n<----- send REGISTER request\n"); SendRegisterMsg(msg, g_StackInfo.serv_addr); /* シ〖ケンス戎規を1つ渴める */ g_StackInfo.seq++; return 0;}/* 判峽猴近脫のREGISTERを侯喇し流慨する */int SendUnRegister(char* msg){ int ret; /* スタ〖トライン */ ret = set_Startline(Method_Register, msg, g_StackInfo.serv_fqdn); if(ret<0){ debug("Error!!SendUnRegister set_Startline failed.\n"); return -1; } /* Via */ { char field[MAX_FIELD]; Make_Via(field, g_StackInfo.addr, g_StackInfo.seq); ret = set_Via(msg, field); if(ret<0){ debug("Error!!SendUnRegister set_Via failed.\n"); return -1; } } /* Max-Forwards */ ret = set_Maxforwards(msg, MAX_COUNT); if(ret<0){ debug("Error!!SendUnRegister set_Maxforwards failed.\n"); return -1; } /* FromとTo */ { char field[MAX_FIELD]; char fieldto[MAX_FIELD]; sprintf(field, "%s <sip:%s@%s>;tag=s%d" , g_StackInfo.username, g_StackInfo.username, g_StackInfo.fqdn, RANDOM(100000)); ret = set_From( msg, field); if(ret<0){ debug("Error!!SendRegister set_From failed.\n"); return -1; } sprintf(fieldto, "%s <sip:%s@%s>" , g_StackInfo.username, g_StackInfo.username, g_StackInfo.fqdn); ret = set_To( msg, fieldto); if(ret<0){ debug("Error!!SendUnRegister set_To failed.\n"); return -1; } } /* Call-ID */ { char field[MAX_FIELD]; sprintf(field, "%d-%d-%d@%s", RANDOM(10000), RANDOM(10000), RANDOM(10000), g_StackInfo.fqdn); ret = set_CallID( msg, field); if(ret<0){ debug("Error!!SendUnRegister set_CallID failed.\n"); return -1; } } /* CSeq */ { char field[MAX_FIELD]; sprintf(field, "%d %s" , g_StackInfo.seq, METHOD_REGISTER); ret = set_CSeq( msg, field); if(ret<0){ debug("Error!!SendUnRegister set_CallID failed.\n"); return -1; } } /* Expires */ ret = set_Expires(msg, 0); if(ret<0){ debug("Error!!SendUnRegister set_Expires failed.\n"); return -1; } /* Contact */ ret = set_ContactA(msg, g_StackInfo.addr, g_StackInfo.username); if(ret<0){ debug("Error!!SendUnRegister set_Contact failed.\n"); return -1; } /* Content-Length */ ret = set_Contentlength(msg, 0); if(ret<0){ debug("Error!!SendUnRegister set_Contentlength failed.\n"); return -1; } debug("\n<----- send REGISTER request(Expires = 0)\n"); SendRegisterMsg(msg, g_StackInfo.serv_addr); return 0;}/* INVITEを侯喇し流慨する */int SendInvite(char* msg, char* username, char* called, int rtpport){ int ret; char hostname[MAX_NAME]; struct hostent host; struct hostent* phost = &host; char* addrbuff; /* SIPサ〖バの蝗脫、踏蝗脫の冉年 */ if(g_StackInfo.server_flag == eRNull){ gethostname(hostname, MAX_NAME); phost = gethostbyname(hostname); /* シ〖ケンス戎規の瘦賂 */ g_StackInfo.seq = 1+RANDOM(10000); /* 極眉瑣のユ〖ザ嘆、IPアドレス、FQDNを瘦賂する */ strcpy(g_StackInfo.fqdn, phost->h_name); addrbuff = inet_ntoa(*(struct in_addr*)phost->h_addr_list[0]); strcpy(g_StackInfo.addr, addrbuff); } if(g_StackInfo.username == NULL|| called == NULL){ debug("Error!!SendInvite failed.\n"); return -1; } /* スタ〖トライン */ ret = set_Startline(Method_Invite, msg, called); if(ret<0){ debug("Error!!SendInvite set_Startline failed.\n"); return -1; } /* Via */ { char field[MAX_FIELD]; Make_Via(field, g_StackInfo.addr, g_StackInfo.seq); ret = set_Via(msg, field); if(ret<0){ debug("Error!!SendInvite set_Via failed.\n"); return -1; } /* Viaヘッダ〖の攫鼠を瘦賂 */ strcpy(g_SipMsg.save_Via, field); } /* Max-Forwards */ ret = set_Maxforwards(msg, MAX_COUNT); if(ret<0){ debug("Error!!SendInvite set_Maxforwards failed.\n"); return -1; } /* From */ { char field[MAX_FIELD]; sprintf(field, "%s <sip:%s@%s>;tag=s%d" , username, username, g_StackInfo.fqdn, RANDOM(100000)); ret = set_From( msg, field); if(ret<0){ debug("Error!!SendInvite set_From failed.\n"); return -1; } /* Fromヘッダの攫鼠を瘦賂 */ strcpy(g_SipMsg.save_From, field); } /* To */ { char* puser; char tmp[MAX_FIELD]; char field[MAX_FIELD]; strcpy(tmp, called); puser = strstr(tmp, "@"); if(puser==0){ debug("Error!!SendInvite To no @ failed.\n"); return -1; } *puser = 0; /* NULL */ sprintf(field, "%s <sip:%s>" , tmp, called); ret = set_To( msg, field); if(ret<0){ debug("Error!!SendInvite set_To failed.\n"); return -1; } /* Toヘッダの攫鼠を瘦賂 */ strcpy(g_SipMsg.save_To, field); } /* Call-ID */ { char field[MAX_FIELD]; sprintf(field, "%d-%d-%d@%s", RANDOM(10000), RANDOM(10000), RANDOM(10000), g_StackInfo.fqdn); ret = set_CallID( msg, field); if(ret<0){ debug("Error!!SendInvite set_CallID failed.\n"); return -1; } /* Call-IDヘッダの攫鼠を瘦賂 */ strcpy(g_SipMsg.save_CallID, field); } /* CSeq */ { char field[MAX_FIELD]; sprintf(field, "%d %s" , g_StackInfo.seq, METHOD_INVITE); ret = set_CSeq( msg, field); if(ret<0){ debug("Error!!SendInvite set_CSeq failed.\n"); return -1; } /* CSeqの攫鼠を瘦賂 */ strcpy(g_SipMsg.save_Cseq, field); } /* Contact */ ret = set_ContactA(msg, g_StackInfo.addr, username); if(ret<0){ debug("Error!!SendInvite set_Contact failed.\n"); return -1; } /* Content-Type */ ret = set_Contenttype(msg, CONTENT_TYPE); if(ret<0){ debug("Error!!SendInvite set_Contenttype failed.\n"); return -1; } /* Content-Length、SDP */ { int contentlen; char field[MAX_FIELD]; make_SDP(field, g_StackInfo.username, g_StackInfo.addr, g_StackInfo.fqdn, CODEC_AUDIO, RTPTYPE, AUDIO_RATE, g_StackInfo.rtpport, NULL); contentlen = strlen(field); ret = set_Contentlength(msg, contentlen); if(ret<0){ debug("Error!!SendInvite set_Contentlength failed.\n"); return -1; } set_SDP(msg, field); } /* シ〖ケンス戎規を1つ渴める */ g_StackInfo.seq++; /* 券慨莢フラグを惟てる */ g_StackInfo.session_flag = eCSender; /* メッセ〖ジを瘦賂する */ save_message(msg, &g_SipMsg); debug("\n<---- send INVITE request\n"); ret = SendSipMessage(msg); if(ret < 0){ debug("SendSipMessage failed in SendInvite.\n"); } g_StackInfo.state = eSWaitBusy; return 0;}/* 100 Tryingを侯喇し流慨する */int SendTrying(char* msg){ int ret; char field[MAX_FIELD]; /* スタ〖トライン */ ret = set_Startline(Method_Trying, msg, NULL); if(ret<0){ debug("Error!!SendTrying set_Startline failed.\n"); return -1; } /* Via */ ret = set_Via(msg, g_SipMsg.save_Via); if(ret<0){ debug("Error!!SendTrying set_Via failed.\n"); return -1; } if (g_StackInfo.server_flag == eRRegister){ ret = set_Via(msg, g_SipMsg.save_Via2nd); if(ret<0){ debug("Error!!SendTrying 2nd set_Via failed.\n"); return -1; } } /* Max-Forwards */ ret = set_Maxforwards(msg, MAX_COUNT); if(ret<0){ debug("Error!!SendTrying set_Maxforwards failed.\n"); return -1; } /* From */ ret = set_From( msg, g_SipMsg.save_From); if(ret<0){ debug("Error!!SendTrying set_From failed.\n"); return -1; } /* To */ /* Toタグがない眷圭は、納裁する */ strcpy(field, g_SipMsg.save_To); if(!strstr(g_SipMsg.save_To,"tag=")){ char* mp = strchr(field, '\0'); sprintf(mp, ";tag=r%d", RANDOM(100000)); } strcpy(g_SipMsg.save_To, field); ret = set_To( msg, field); if(ret<0){ debug("Error!!SendTrying set_To failed.\n"); return -1; } /* Call-ID */ ret = set_CallID( msg, g_SipMsg.save_CallID); if(ret<0){ debug("Error!!SendTrying set_CallID failed.\n"); return -1; } /* CSeq */ ret = set_CSeq( msg, g_SipMsg.save_Cseq); if(ret<0){ debug("Error!!SendTrying set_CSeq failed.\n"); return -1; } /* Content-Length */ ret = set_Contentlength(msg, 0); if(ret<0){ debug("Error!!SendTrying set_Contentlength failed.\n"); return -1; } debug("\n<----- send Trying response\n"); ret = SendSipMessage(msg); if(ret < 0){ debug("SendSipMessage failed.\n"); } return 0;}/* 180 Ringingを侯喇し流慨する */int SendRinging(char* msg){ int ret; /* スタ〖トライン */ ret = set_Startline(Method_Ringing, msg, NULL); if(ret<0){ debug("Error!!SendRinging set_Startline failed.\n"); return -1; } /* Via */ ret = set_Via(msg, g_SipMsg.save_Via); if(ret<0){ debug("Error!!SendRinging set_Via failed.\n"); return -1; } if (g_StackInfo.server_flag == eRRegister){ ret = set_Via(msg, g_SipMsg.save_Via2nd); if(ret<0){ debug("Error!!SendTrying 2nd set_Via failed.\n"); return -1; } } /* Max-Forwards */ ret = set_Maxforwards(msg, MAX_COUNT); if(ret<0){ debug("Error!!SendRinging set_Maxforwards failed.\n"); return -1; } /* From */ ret = set_From( msg, g_SipMsg.save_From); if(ret<0){ debug("Error!!SendRinging set_From failed.\n"); return -1; } /* To */ ret = set_To( msg, g_SipMsg.save_To); if(ret<0){ debug("Error!!SendRinging set_To failed.\n");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -