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

📄 stack_if.c

📁 linux下的sip voip程序
💻 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 + -