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

📄 functions.h

📁 用来作为linux中SIP SERVER,完成VOIP网络电话中服务器的功能
💻 H
字号:
/* $Id: functions.h,v 1.4 2004/11/09 15:15:11 andrei Exp $ * * Copyright (C) 2004 Dan Pascu * Copyright (C) 2003 Porta Software Ltd * * This file is part of ser, a free SIP server. * * ser is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version * * For a license to use the ser software under conditions * other than those described here, or to purchase support for this * software, please contact iptel.org by e-mail at the following addresses: *    info@iptel.org * * ser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * */static voidpingClients(unsigned int ticks, void *param){    static char pingbuf[4] = "\0\0\0\0";    static int length = 256;    struct socket_info* sock;    struct hostent* hostent;    union sockaddr_union to;    struct sip_uri uri;    void *buf, *ptr;    str contact;    int needed;    buf = pkg_malloc(length);    if (buf == NULL) {        LOG(L_ERR, "error: mediaproxy/pingClients(): out of memory\n");        return;    }    needed = userLocation.get_all_ucontacts(buf, length, FL_NAT);    if (needed > 0) {        // make sure we alloc more than actually we were told is missing        // (some clients may register while we are making these calls)        length = (length + needed) * 2;        ptr = pkg_realloc(buf, length);        if (ptr == NULL) {            LOG(L_ERR, "error: mediaproxy/pingClients(): out of memory\n");            pkg_free(buf);            return;        } else {            buf = ptr;        }        // try again. we may fail again if _many_ clients register in between        needed = userLocation.get_all_ucontacts(buf, length, FL_NAT);        if (needed != 0) {            pkg_free(buf);            return;        }    }    ptr = buf;    while (1) {        memcpy(&(contact.len), ptr, sizeof(contact.len));        if (contact.len == 0)            break;        contact.s = (char*)ptr + sizeof(contact.len);        ptr = contact.s + contact.len;        if (parse_uri(contact.s, contact.len, &uri) < 0) {            LOG(L_ERR, "error: mediaproxy/pingClients(): can't parse contact uri\n");            continue;        }        if (uri.proto != PROTO_UDP && uri.proto != PROTO_NONE)            continue;        if (uri.port_no == 0)            uri.port_no = SIP_PORT;        hostent = sip_resolvehost(&uri.host, &uri.port_no, PROTO_UDP);        if (hostent == NULL){            LOG(L_ERR, "error: mediaproxy/pingClients(): can't resolve host\n");            continue;        }        hostent2su(&to, hostent, 0, uri.port_no);        sock = get_send_socket(0, &to, PROTO_UDP);        if (sock == NULL) {            LOG(L_ERR, "error: mediaproxy/pingClients(): can't get sending socket\n");            continue;        }        udp_send(sock, pingbuf, sizeof(pingbuf), &to);    }    pkg_free(buf);}// Replace IP:Port in Contact field with the source address of the packet.// Preserve port for SIP asymmetric clientsstatic intFixContact(struct sip_msg* msg, char* str1, char* str2){    str beforeHost, after, agent;    contact_t* contact;    struct lump* anchor;    struct sip_uri uri;    char *newip, *buf;    int len, newiplen, offset;    Bool asymmetric;    if (!getContactURI(msg, &uri, &contact))        return -1;    if (uri.proto != PROTO_UDP && uri.proto != PROTO_NONE)        return -1;    newip = ip_addr2a(&msg->rcv.src_ip);    newiplen = strlen(newip);    /* Don't do anything if the IP's are the same. Return success. */    if (newiplen==uri.host.len && memcmp(uri.host.s, newip, newiplen)==0) {        return 1;    }    if (uri.port.len == 0)        uri.port.s = uri.host.s + uri.host.len;    agent = getUserAgent(msg);    asymmetric = isSIPAsymmetric(agent);    beforeHost.s   = contact->uri.s;    beforeHost.len = uri.host.s - contact->uri.s;    if (asymmetric) {        // for asymmetrics we preserve the original port        after.s   = uri.port.s;        after.len = contact->uri.s + contact->uri.len - after.s;    } else {        after.s   = uri.port.s + uri.port.len;        after.len = contact->uri.s + contact->uri.len - after.s;    }    len = beforeHost.len + newiplen + after.len + 20;    // first try to alloc mem. if we fail we don't want to have the lump    // deleted and not replaced. at least this way we keep the original.    buf = pkg_malloc(len);    if (buf == NULL) {        LOG(L_ERR, "error: fix_contact(): out of memory\n");        return -1;    }    offset = contact->uri.s - msg->buf;    anchor = del_lump(msg, offset, contact->uri.len, HDR_CONTACT);    if (!anchor) {        pkg_free(buf);        return -1;    }    if (asymmetric && uri.port.len==0) {        len = sprintf(buf, "%.*s%s%.*s", beforeHost.len, beforeHost.s,                      newip, after.len, after.s);    } else if (asymmetric) {        len = sprintf(buf, "%.*s%s:%.*s", beforeHost.len, beforeHost.s,                      newip, after.len, after.s);    } else {        len = sprintf(buf, "%.*s%s:%d%.*s", beforeHost.len, beforeHost.s,                      newip, msg->rcv.src_port, after.len, after.s);    }    if (insert_new_lump_after(anchor, buf, len, HDR_CONTACT) == 0) {        pkg_free(buf);        return -1;    }    contact->uri.s   = buf;    contact->uri.len = len;    if (asymmetric) {        LOG(L_INFO, "info: fix_contact(): preserved port for SIP "            "asymmetric client: `%.*s'\n", agent.len, agent.s);    }    return 1;}

⌨️ 快捷键说明

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