?? sip_ctrl.c
字號:
return -1; } /* Call-ID */ ret = set_CallID( msg, g_SipMsg.save_CallID); if(ret<0){ debug("Error!!SendRinging set_CallID failed.\n"); return -1; } /* CSeq */ ret = set_CSeq( msg, g_SipMsg.save_Cseq); if(ret<0){ debug("Error!!SendRinging set_CSeq failed.\n"); return -1; } /* Content-Length */ ret = set_Contentlength(msg, 0); if(ret<0){ debug("Error!!SendRinging set_Contentlength failed.\n"); return -1; } ret = SendSipMessage(msg); debug("\n<----- send Ringing response\n"); if(ret < 0){ debug("SendSipMessage failed.\n"); } return 0;}/* 200 OKを侯喇し流慨する */int SendOK(char* msg){ int ret; enum method emethod; /* レスポンスを手すメッセ〖ジの鹼侍を冉年する */ emethod = Search_Method(g_SipMsg.save_Msg); /* スタ〖トライン */ ret = set_Startline(Method_OK, msg, NULL); if(ret<0){ debug("Error!!SendOK set_Startline failed.\n"); return -1; } /* Via */ ret = set_Via(msg, g_SipMsg.save_Via); if(ret<0){ debug("Error!!SendOK set_Via failed.\n"); return -1; } if(g_StackInfo.server_flag == eRRegister){ ret = set_Via(msg, g_SipMsg.save_Via2nd); }else{ *(g_SipMsg.save_Via2nd) = '\0'; } /* Max-Forwards */ ret = set_Maxforwards(msg, MAX_COUNT); if(ret<0){ debug("Error!!SendInvite set_Maxforwards failed.\n"); return -1; } /* From */ ret = set_From( msg, g_SipMsg.save_From); if(ret<0){ debug("Error!!SendInvite set_From failed.\n"); return -1; } /* To */ { char field[MAX_FIELD]; char* mp; memset(field, 0, MAX_FIELD); strcpy(field, g_SipMsg.save_To); /* Toタグがない眷圭、納裁する */ if(!strstr(g_SipMsg.save_To,"tag=")){ mp = strchr(field, '\0'); sprintf(mp, ";tag=r%d", RANDOM(100000)); } ret = set_To( msg, field); if(ret<0){ debug("Error!!SendInvite set_To failed.\n"); return -1; } } /* Call-ID */ ret = set_CallID( msg, g_SipMsg.save_CallID); if(ret<0){ debug("Error!!SendInvite set_CallID failed.\n"); return -1; } switch(g_StackInfo.state){ case eSWaitBusy:{ /* CSeq */ ret = set_CSeq( msg, g_SipMsg.save_Cseq); if(ret<0){ debug("Error!!SendInvite set_CSeq failed.\n"); return -1; } /* Contact */ ret = set_ContactA(msg, g_StackInfo.addr, g_StackInfo.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 o[MAX_FIELD]; char field[MAX_FIELD]; memset(field, 0, MAX_FIELD); memset(o, 0, MAX_FIELD); /* 減慨したINVITEのSDPからoの攫鼠を艱評 */ get_o(g_SipMsg.save_Msg, o); make_SDP(field, g_StackInfo.username, g_StackInfo.addr, g_StackInfo.fqdn, CODEC_AUDIO, RTPTYPE, AUDIO_RATE, g_StackInfo.rtpport, o); contentlen = strlen(field); ret = set_Contentlength(msg, contentlen); if(ret<0){ debug("Error!!SendInvite set_Contentlength failed.\n"); return -1; } printf("ok\n"); set_SDP(msg, field); } }break; case eSWaitDisc:{ /* CSeq */ ret = set_CSeq( msg, g_SipMsg.save_Cseq); if(ret<0){ debug("Error!!SendInvite set_CSeq failed.\n"); return -1; } /* Content-Length */ ret = set_Contentlength(msg, 0); if(ret<0){ debug("Error!!SendInvite set_Contentlength failed.\n"); return -1; } }break; default: break; } debug("\n<----- send OK response\n"); ret = SendSipMessage(msg); if(ret < 0){ debug("SendSipMessage failed.\n"); } return 0;}/* ACKを侯喇し流慨する */int SendAck(char* msg){ int ret; char* sp, *ep; char tmp[256], tmp2[256]; /* スタ〖トライン */ strcpy(tmp, g_SipMsg.save_To); sp = strstr(tmp, "<sip:"); ep = strstr(tmp, ">"); strncpy(tmp2, sp+5, ep-(sp+5)); tmp2[ep-(sp+5)] = '\0'; ret = set_Startline(Method_Ack, msg, tmp2); if(ret<0){ debug("Error!!SendAck set_Startline failed.\n"); return -1; } /* Via */ ret = set_Via(msg, g_SipMsg.save_Via); if(ret<0){ debug("Error!!SendAck set_Via failed.\n"); return -1; } /* Max-Forwards */ ret = set_Maxforwards(msg, MAX_COUNT); if(ret<0){ debug("Error!!SendAck set_Maxforwards failed.\n"); return -1; } /* From */ ret = set_From( msg, g_SipMsg.save_From); if(ret<0){ debug("Error!!SendAck set_From failed.\n"); return -1; } /* To */ ret = set_To( msg, g_SipMsg.save_To); if(ret<0){ debug("Error!!SendAck set_To failed.\n"); return -1; } /* Call-ID */ ret = set_CallID( msg, g_SipMsg.save_CallID); if(ret<0){ debug("Error!!SendAck set_CallID failed.\n"); return -1; } /* CSeq */ { int seqnum; char field[MAX_FIELD]; seqnum = get_CSeqnum(g_SipMsg.save_Cseq); memset(field, 0, MAX_FIELD); sprintf(field, "%d %s", seqnum, METHOD_ACK); ret = set_CSeq( msg, field); if(ret<0){ debug("Error!!SendAck set_CSeq failed.\n"); return -1; } } /* Content-Length */ ret = set_Contentlength(msg, 0); if(ret<0){ debug("Error!!SendAck set_Contentlength failed.\n"); return -1; } debug("\n<----- send Ack request\n"); ret = SendSipMessage(msg); if(ret < 0){ debug("SendSipMessage failed.\n"); } return 0;}/* BYEを侯喇し流慨する */int SendBye(char* msg){ int ret; /* スタ〖トライン */ { char buf[MAX_FIELD], buf2[MAX_FIELD], *ptr, *ptr2; if(g_StackInfo.session_flag == eCSender){ strcpy(buf, g_SipMsg.save_To); }else{ strcpy(buf, g_SipMsg.save_From); } ptr = strstr(buf, "sip:"); ptr += 4; ptr2 = strstr(ptr, ">"); *ptr2=0; strcpy(buf2, ptr); ret = set_Startline(Method_Bye, msg, buf2); if(ret<0){ debug("Error!!SendBye set_Startline failed.\n"); return -1; } } /* Via */ { char field[MAX_FIELD]; memset(field, 0, MAX_FIELD); Make_Via(field, g_StackInfo.addr, g_StackInfo.seq); ret = set_Via(msg, field); if(ret<0){ debug("Error!!SendBye 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!!SendBye set_Maxforwards failed.\n"); return -1; } if(g_StackInfo.session_flag == eCSender){ /* From */ ret = set_From( msg, g_SipMsg.save_From); if(ret<0){ debug("Error!!SendBye set_From failed.\n"); return -1; } /* To */ ret = set_To( msg, g_SipMsg.save_To); if(ret<0){ debug("Error!!SendBye set_To failed.\n"); return -1; } }else { /* From */ ret = set_From( msg, g_SipMsg.save_To); if(ret<0){ debug("Error!!SendBye set_From failed.\n"); return -1; } /* To */ ret = set_To( msg, g_SipMsg.save_From); if(ret<0){ debug("Error!!SendBye set_To failed.\n"); return -1; } } /* Call-ID */ ret = set_CallID( msg, g_SipMsg.save_CallID); if(ret<0){ debug("Error!!SendBye set_CallID failed.\n"); return -1; } /* CSeq */ { char field[MAX_FIELD]; memset(field, 0, MAX_FIELD); sprintf(field, "%d %s", g_StackInfo.seq, METHOD_BYE); ret = set_CSeq( msg, field); if(ret<0){ debug("Error!!SendBye set_CSeq failed.\n"); return -1; } } /* Contact */ ret = set_ContactA(msg, g_StackInfo.fqdn, g_StackInfo.username); if(ret<0){ debug("Error!!SendBye set_Contact failed.\n"); return -1; } /* Content-Length */ ret = set_Contentlength(msg, 0); if(ret<0){ debug("Error!!SendBye set_Contentlength failed.\n"); return -1; } save_message(msg, &g_SipMsg); debug("\n<----- send BYE request\n"); ret = SendSipMessage(msg); if(ret < 0){ debug("SendSipMessage failed.\n"); return -1; } g_StackInfo.state = eSWaitDisc; return 0;}/* CANCELを侯喇し流慨する */int SendCancel(char* msg){ int ret; char* sp, *ep; char tmp[256], tmp2[256]; /* スタ〖トライン */ strcpy(tmp, g_SipMsg.save_To); sp = strstr(tmp, "<sip:"); ep = strstr(tmp, ">"); strncpy(tmp2, sp+5, ep-(sp+5)); tmp2[ep-(sp+5)] = '\0'; ret = set_Startline(Method_Cancel, msg, tmp2); if(ret<0){ debug("Error!!SendCancel set_Startline failed.\n"); return -1; } /* Via */ ret = set_Via(msg, g_SipMsg.save_Via); if(ret<0){ debug("Error!!SendCancel set_Via failed.\n"); return -1; } /* Max-Forwards */ ret = set_Maxforwards(msg, MAX_COUNT); if(ret<0){ debug("Error!!SendCancel set_Maxforwards failed.\n"); return -1; } /* From */ ret = set_From( msg, g_SipMsg.save_From); if(ret<0){ debug("Error!!SendCancel set_From failed.\n"); return -1; } /* To */ ret = set_To( msg, g_SipMsg.save_To); if(ret<0){ debug("Error!!SendCancel set_To failed.\n"); return -1; } /* Call-ID */ ret = set_CallID( msg, g_SipMsg.save_CallID); if(ret<0){ debug("Error!!SendCancel set_CallID failed.\n"); return -1; } /* CSeq */ { int seqnum; char field[MAX_FIELD]; memset(field, 0, MAX_FIELD); seqnum = get_CSeqnum(g_SipMsg.save_Cseq); sprintf(field, "%d %s", seqnum, METHOD_CANCEL); ret = set_CSeq( msg, field); if(ret<0){ debug("Error!!SendCancel set_CSeq failed.\n"); return -1; } } /* Contact */ ret = set_ContactA(msg, g_StackInfo.addr, g_StackInfo.username); if(ret<0){ debug("Error!!SendCancel set_Contact failed.\n"); return -1; } /* Content-Length */ ret = set_Contentlength(msg, 0); if(ret<0){ debug("Error!!SendCancel set_Contentlength failed.\n"); return -1; } save_message(msg, &g_SipMsg); printf("\n<----- send CANCELL request\n"); ret = SendSipMessage(msg); if(ret < 0){ debug("SendSipMessage failed.\n"); return -1; } g_StackInfo.state = eSWaitDisc; return 0;}/* 486 Busy Hereを侯喇する */int SendBusy(char* msg, char* r_msg){ int ret; /* スタ〖トライン */ ret = set_Startline(Method_Busy, msg, NULL); if(ret<0){ debug("Error!!SendBusy set_Startline failed.\n"); return -1; } /* Via */ { char field[MAX_FIELD]; memset(field, 0, MAX_FIELD); get_Via(r_msg, field); ret = set_Via(msg, field); if(g_StackInfo.server_flag == eRRegister){ get_Via2nd(r_msg, field); ret = set_Via(r_msg, field); } if(ret<0){ debug("Error!!SendBusy set_Via failed.\n"); return -1; } } /* Max-Forwards */ ret = set_Maxforwards(msg, MAX_COUNT); if(ret<0){ debug("Error!!SendBusy set_Maxforwards failed.\n"); return -1; } /* From */ { char field[MAX_FIELD]; memset(field, 0, MAX_FIELD); get_From(r_msg, field); ret = set_From( msg, field); if(ret<0){ debug("Error!!SendBusy set_From failed.\n"); return -1; } } /* To */ { char field[MAX_FIELD]; memset(field, 0, MAX_FIELD); get_To(r_msg, field); ret = set_To( msg, field); if(ret<0){ debug("Error!!SendBusy set_To failed.\n"); return -1; } } /* Call-ID */ { char field[MAX_FIELD]; memset(field, 0, MAX_FIELD); get_CallID(r_msg, field); ret = set_CallID( msg, field); if(ret<0){ debug("Error!!SendBusy set_CallID failed.\n"); return -1; } } /* CSeq */ {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -