📄 stack_if.c
字号:
#include "stack_if.h"#include <errno.h>extern SAVE_MSG g_SipMsg;extern STACK_INFO g_StackInfo;/* コ〖ルバック簇眶凡 *//* 眉琐に滦して缅慨奶梦を乖う */int incomingcall(){ printf("\nIncoming call %s ...,\n", g_SipMsg.save_From); printf("if you accept this call, please input 'o'.\n"); printf("if you decline this call, please input 'b'.\n"); return 0;}/* 眉琐に滦して儡鲁奶梦を乖う */int connection(){ char* ep; char from[MAX_FIELD]; strcpy(from ,g_SipMsg.save_From); ep = strstr(from, ";"); *ep = '\0'; printf("\nconnection success with %s\n", from); printf("When you send audio rtp, please input 's'.\n"); printf("When you would like to disconnect this call, please input 'b'.\n"); return 0;}/* 眉琐に滦して儡鲁奶梦を乖う */int disconnect(){ printf("\nDisconnect\n"); return 0;}/* 流减慨脱簇眶 *//* REGISTERメッセ〖ジ流慨 */void SendRegisterMsg(char* msg, char* serverip){ struct sockaddr_in server; int sock; if(msg == NULL){ return; } /* 侯喇したメッセ〖ジを茶烫に山绩する */ printf("\n----------------------------------------\n"); printf("%s", msg); printf("----------------------------------------\n"); /* 流慨脱ソケットの侯喇 */ memset(&server, 0, sizeof(server)); server.sin_family = AF_INET; server.sin_port = htons(SIP_PORT); server.sin_addr.s_addr = inet_addr(serverip); sock = socket(server.sin_family, SOCK_DGRAM, IPPROTO_UDP); if(sock < 0){ debug("Error!!socket create failed.\n"); return; } sendto(sock, msg, strlen(msg), 0, (struct sockaddr*)&server, sizeof(server)); close(sock);}/* SIPメッセ〖ジ流慨 */int SendSipMessage(char* msg ){ struct sockaddr_in term; int sock; int byte; enum method s_method; char* sp = NULL; char* ep = NULL; char addr[ADDR_SIZE]; if(msg == NULL){ debug("Error!! No msg = NULL in SendSipMessage.\n"); return -1; } memset(addr, 0, ADDR_SIZE); /* 侯喇したメッセ〖ジを茶烫に山绩する */ printf("\n----------------------------------------\n"); printf("%s", msg); printf("----------------------------------------\n"); /* 流慨脱ソケットの侯喇 */ memset(&term, 0, sizeof(term)); term.sin_family = AF_INET; term.sin_port = htons(SIP_PORT); /* PtoP */ if (g_StackInfo.server_flag == eRNull){ /* メッセ〖ジ硷侍冉年 */ s_method = Search_Method(msg); /* msgがリクエストの眷圭にはtoから陵缄黎アドレスを掐缄する */ if(1 <= s_method && s_method <= 4){ char termname[MAX_NAME]; char line[MAX_FIELD]; struct hostent* phost; memset(termname, 0, MAX_NAME); memset(line, 0, MAX_FIELD); get_To(msg, line); sp = strchr(line, '@'); ep = strchr(line, '.'); if(ep == NULL){ debug("Error!! No fqdn in To header in SendSipMessage.\n"); return -1; } strncpy(termname, sp+1, (strlen(sp+1)-strlen(ep))); phost = gethostbyname(termname); if(phost == NULL){ debug("Error!! gethostbyname in SendSipMessage.\n"); return -1; } term.sin_addr = *(struct in_addr*)phost->h_addr_list[0]; } /* msgがレスポンスの眷圭にはViaヘッダから陵缄黎アドレスを掐缄する */ else if(5 <= s_method && s_method <= 9){ char line[MAX_FIELD]; memset(line, 0,MAX_FIELD); get_Via(msg, line); sp = strchr(line, ' '); ep = strchr(sp, ':'); strncpy(addr, sp+1, (strlen(sp+1)-strlen(ep))); term.sin_addr.s_addr = inet_addr(addr); }else{ debug("Error!!Send method undefined.\n"); return -1; } }else{ /* メッセ〖ジ硷侍冉年 */ s_method = Search_Method(msg); /* msgがリクエストの眷圭にはサ〖バに流る */ if(1 <= s_method && s_method <= 4){ char termname[MAX_NAME]; char line[MAX_FIELD]; struct hostent* phost; struct hostent* psvrhost; struct in_addr iaddr; inet_aton(g_StackInfo.serv_addr, &iaddr); psvrhost = gethostbyaddr((char*)&iaddr, 4, AF_INET); if (psvrhost == NULL){ debug("SIP server name is not resolved in SendSipMessage."); return -1; } strcpy(termname, psvrhost->h_name); phost = gethostbyname(termname); if(phost == NULL){ debug("gethostbyname error in SendSipMessage.\n"); return -1; } term.sin_addr = *(struct in_addr*)phost->h_addr_list[0]; } /* msgがレスポンスの眷圭にはViaヘッダから陵缄黎アドレスを掐缄する */ else if(5 <= s_method && s_method <= 9){ char line[MAX_FIELD]; memset(line, 0,MAX_FIELD); get_Via(msg, line); sp = strchr(line, ' '); ep = strchr(sp, ':'); strncpy(addr, sp+1, (strlen(sp+1)-strlen(ep))); term.sin_addr.s_addr = inet_addr(addr); }else{ debug("Error!!Send method undefined.\n"); return -1; } } sock = socket(term.sin_family, SOCK_DGRAM, IPPROTO_UDP); /* ソケット侯喇己窃 */ if(sock < 0){ debug("Error!!socket create failed.\n"); return -1; } byte = sendto(sock, msg, strlen(msg), 0, (struct sockaddr*)&term, sizeof(term)); if(byte<0){ char err[256]; strcpy(err, strerror(errno)); printf("%s\n", err); } close(sock); return 0;}/* 减慨したメッセ〖ジのスタ〖トラインを豺老し、借妄を慷り尸ける */void* RecvSipMsg(void* info){ struct sockaddr_in term; unsigned int termsize; unsigned int r_msgsize; enum method r_method; char cid[MAX_FIELD]; char msg[MAX_MESSAGE]; int sock; /* 减慨脱ソケットの侯喇 */ memset(&term, 0, sizeof(term)); term.sin_family = AF_INET; term.sin_port = htons(SIP_PORT); term.sin_addr.s_addr = htonl(INADDR_ANY); sock = ((RECV_INFO*)info)->sock; /* ソケット侯喇己窃 */ if(bind(sock, (struct sockaddr *)&term, sizeof(term)) < 0){ debug("Error!!socket create failed.\n"); return; } while(1){ termsize = sizeof(term); memset(msg, 0, MAX_MESSAGE); if(r_msgsize = recvfrom(sock, msg, MAX_MESSAGE, 0, (struct sockaddr*)&term, &termsize) < 0){ debug("Error!!recvfrom failed.\n"); continue; } if(msg==NULL){ debug("Error!!Receive message is NULL.\n"); } printf("\n----------------------------------------\n"); printf("%s", msg); printf("----------------------------------------\n"); r_method = Search_Method(msg); if(0 <= r_method && r_method <= 4){ RecvRequest(r_method, msg, ((RECV_INFO*)info)); }else if(5 <= r_method && r_method <= 9){ RecvResponse(r_method, msg,((RECV_INFO*)info)); }else{ debug("Error!!Receive method undefined.\n"); return; } } return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -