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

📄 dns_test.c

📁 基于sip协议的网络电话源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id: dns_test.c 1036 2007-03-03 02:15:41Z bennylp $ *//*  * Copyright (C) 2003-2007 Benny Prijono <benny@prijono.org> * * This program 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. * * This program 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  */#include "test.h"#include <pjsip.h>#include <pjlib.h>#include <pjlib-util.h>/* For logging purpose. */#define THIS_FILE   "dns_test.c"struct result{    pj_status_t		    status;    pjsip_server_addresses  servers;};static void cb(pj_status_t status,	       void *token,	       const struct pjsip_server_addresses *addr){    struct result *result = token;    result->status = status;    if (status == PJ_SUCCESS)	pj_memcpy(&result->servers, addr, sizeof(*addr));}static void add_dns_entries(pj_dns_resolver *resv){    /* Inject DNS SRV entry */    pj_dns_parsed_packet pkt;    pj_dns_parsed_rr ans[4];    pj_dns_parsed_rr ar[5];    pj_str_t tmp;    unsigned i;    /*     * This is answer to SRV query to "example.com" domain, and     * the answer contains full reference to the A records of     * the server. The full DNS records is :     _sip._udp.example.com 3600 IN SRV 0 0  5060 sip01.example.com.     _sip._udp.example.com 3600 IN SRV 0 20 5060 sip02.example.com.     _sip._udp.example.com 3600 IN SRV 0 10 5060 sip03.example.com.     _sip._udp.example.com 3600 IN SRV 1 0  5060 sip04.example.com.          sip01.example.com. 3600 IN A       1.1.1.1     sip02.example.com. 3600 IN A       2.2.2.2     sip03.example.com. 3600 IN A       3.3.3.3     sip04.example.com. 3600 IN A       4.4.4.4          ; Additionally, add A record for "example.com"     example.com.	3600 IN A       5.5.5.5     */    pj_bzero(&pkt, sizeof(pkt));    pj_bzero(ans, sizeof(ans));    pj_bzero(ar, sizeof(ar));    pkt.hdr.flags = PJ_DNS_SET_QR(1);    pkt.hdr.anscount = PJ_ARRAY_SIZE(ans);    pkt.hdr.arcount = 0;    pkt.ans = ans;    pkt.arr = ar;    ans[0].name = pj_str("_sip._udp.example.com");    ans[0].type = PJ_DNS_TYPE_SRV;    ans[0].dnsclass = PJ_DNS_CLASS_IN;    ans[0].ttl = 3600;    ans[0].rdata.srv.prio = 0;    ans[0].rdata.srv.weight = 0;    ans[0].rdata.srv.port = 5060;    ans[0].rdata.srv.target = pj_str("sip01.example.com");    ans[1].name = pj_str("_sip._udp.example.com");    ans[1].type = PJ_DNS_TYPE_SRV;    ans[1].dnsclass = PJ_DNS_CLASS_IN;    ans[1].ttl = 3600;    ans[1].rdata.srv.prio = 0;    ans[1].rdata.srv.weight = 20;    ans[1].rdata.srv.port = 5060;    ans[1].rdata.srv.target = pj_str("sip02.example.com");    ans[2].name = pj_str("_sip._udp.example.com");    ans[2].type = PJ_DNS_TYPE_SRV;    ans[2].dnsclass = PJ_DNS_CLASS_IN;    ans[2].ttl = 3600;    ans[2].rdata.srv.prio = 0;    ans[2].rdata.srv.weight = 10;    ans[2].rdata.srv.port = 5060;    ans[2].rdata.srv.target = pj_str("sip03.example.com");    ans[3].name = pj_str("_sip._udp.example.com");    ans[3].type = PJ_DNS_TYPE_SRV;    ans[3].dnsclass = PJ_DNS_CLASS_IN;    ans[3].ttl = 3600;    ans[3].rdata.srv.prio = 1;    ans[3].rdata.srv.weight = 0;    ans[3].rdata.srv.port = 5060;    ans[3].rdata.srv.target = pj_str("sip04.example.com");    pj_dns_resolver_add_entry( resv, &pkt, PJ_FALSE);    ar[0].name = pj_str("sip01.example.com");    ar[0].type = PJ_DNS_TYPE_A;    ar[0].dnsclass = PJ_DNS_CLASS_IN;    ar[0].ttl = 3600;    ar[0].rdata.a.ip_addr = pj_inet_addr(pj_cstr(&tmp, "1.1.1.1"));    ar[1].name = pj_str("sip02.example.com");    ar[1].type = PJ_DNS_TYPE_A;    ar[1].dnsclass = PJ_DNS_CLASS_IN;    ar[1].ttl = 3600;    ar[1].rdata.a.ip_addr = pj_inet_addr(pj_cstr(&tmp, "2.2.2.2"));    ar[2].name = pj_str("sip03.example.com");    ar[2].type = PJ_DNS_TYPE_A;    ar[2].dnsclass = PJ_DNS_CLASS_IN;    ar[2].ttl = 3600;    ar[2].rdata.a.ip_addr = pj_inet_addr(pj_cstr(&tmp, "3.3.3.3"));    ar[3].name = pj_str("sip04.example.com");    ar[3].type = PJ_DNS_TYPE_A;    ar[3].dnsclass = PJ_DNS_CLASS_IN;    ar[3].ttl = 3600;    ar[3].rdata.a.ip_addr = pj_inet_addr(pj_cstr(&tmp, "4.4.4.4"));    ar[4].name = pj_str("example.com");    ar[4].type = PJ_DNS_TYPE_A;    ar[4].dnsclass = PJ_DNS_CLASS_IN;    ar[4].ttl = 3600;    ar[4].rdata.a.ip_addr = pj_inet_addr(pj_cstr(&tmp, "5.5.5.5"));    /*      * Create individual A records for all hosts in "example.com" domain.     */    for (i=0; i<PJ_ARRAY_SIZE(ar); ++i) {	pj_bzero(&pkt, sizeof(pkt));	pkt.hdr.anscount = 1;	pkt.hdr.flags = PJ_DNS_SET_QR(1);	pkt.ans = &ar[i];	pj_dns_resolver_add_entry( resv, &pkt, PJ_FALSE);    }    /*      * Simulate DNS error response by creating these answers.     * Sample of invalid SRV records: _sip._udp.sip01.example.com.     */    for (i=0; i<PJ_ARRAY_SIZE(ans); ++i) {	pj_dns_parsed_query q;	char buf[128];	char *services[] = { "_sip._udp.", "_sip._tcp.", "_sips._tcp."};	unsigned j;	for (j=0; j<PJ_ARRAY_SIZE(services); ++j) {	    q.dnsclass = PJ_DNS_CLASS_IN;	    q.type = PJ_DNS_TYPE_SRV;	    q.name.ptr = buf;	    pj_bzero(buf, sizeof(buf));	    pj_strcpy2(&q.name, services[j]);	    pj_strcat(&q.name, &ans[i].rdata.srv.target);	    pj_bzero(&pkt, sizeof(pkt));	    pkt.hdr.qdcount = 1;	    pkt.hdr.flags = PJ_DNS_SET_QR(1) |			    PJ_DNS_SET_RCODE(PJ_DNS_RCODE_NXDOMAIN);	    pkt.q = &q;	    	    pj_dns_resolver_add_entry( resv, &pkt, PJ_FALSE);	}    }    /*     * ANOTHER DOMAIN.     *     * This time we let SRV and A get answered in different DNS     * query.     */    /* The "domain.com" DNS records (note the different the port):	_sip._tcp.domain.com 3600 IN SRV 1 0 50060 sip06.domain.com.	_sip._tcp.domain.com 3600 IN SRV 2 0 50060 sip07.domain.com.	sip06.domain.com. 3600 IN A       6.6.6.6	sip07.domain.com. 3600 IN A       7.7.7.7     */    pj_bzero(&pkt, sizeof(pkt));    pj_bzero(&ans, sizeof(ans));    pkt.hdr.flags = PJ_DNS_SET_QR(1);    pkt.hdr.anscount = 2;    pkt.ans = ans;    /* Add the SRV records, with reverse priority (to test that sorting     * works.     */    ans[0].name = pj_str("_sip._tcp.domain.com");    ans[0].type = PJ_DNS_TYPE_SRV;    ans[0].dnsclass = PJ_DNS_CLASS_IN;    ans[0].ttl = 3600;    ans[0].rdata.srv.prio = 2;    ans[0].rdata.srv.weight = 0;    ans[0].rdata.srv.port = 50060;    ans[0].rdata.srv.target = pj_str("SIP07.DOMAIN.COM");    ans[1].name = pj_str("_sip._tcp.domain.com");    ans[1].type = PJ_DNS_TYPE_SRV;    ans[1].dnsclass = PJ_DNS_CLASS_IN;    ans[1].ttl = 3600;    ans[1].rdata.srv.prio = 1;    ans[1].rdata.srv.weight = 0;    ans[1].rdata.srv.port = 50060;    ans[1].rdata.srv.target = pj_str("SIP06.DOMAIN.COM");    pj_dns_resolver_add_entry( resv, &pkt, PJ_FALSE);    /* From herein there is only one answer */    pkt.hdr.anscount = 1;    /* Add a single SRV for UDP */    ans[0].name = pj_str("_sip._udp.domain.com");    ans[0].type = PJ_DNS_TYPE_SRV;    ans[0].dnsclass = PJ_DNS_CLASS_IN;    ans[0].ttl = 3600;    ans[0].rdata.srv.prio = 0;    ans[0].rdata.srv.weight = 0;    ans[0].rdata.srv.port = 50060;    ans[0].rdata.srv.target = pj_str("SIP06.DOMAIN.COM");    pj_dns_resolver_add_entry( resv, &pkt, PJ_FALSE);    /* Add the A record for sip06.domain.com */    ans[0].name = pj_str("sip06.domain.com");    ans[0].type = PJ_DNS_TYPE_A;    ans[0].dnsclass = PJ_DNS_CLASS_IN;    ans[0].ttl = 3600;    ans[0].rdata.a.ip_addr = pj_inet_addr(pj_cstr(&tmp, "6.6.6.6"));    pj_dns_resolver_add_entry( resv, &pkt, PJ_FALSE);    /* Add the A record for sip07.domain.com */    ans[0].name = pj_str("sip07.domain.com");    ans[0].type = PJ_DNS_TYPE_A;    ans[0].dnsclass = PJ_DNS_CLASS_IN;    ans[0].ttl = 3600;    ans[0].rdata.a.ip_addr = pj_inet_addr(pj_cstr(&tmp, "7.7.7.7"));    pj_dns_resolver_add_entry( resv, &pkt, PJ_FALSE);}/* * Perform server resolution where the results are expected to * come in strict order. */static int test_resolve(const char *title,			pj_pool_t *pool,			pjsip_transport_type_e type,			char *name,			int port,			pjsip_server_addresses *ref){    pjsip_host_info dest;    struct result result;    PJ_LOG(3,(THIS_FILE, " test_resolve(): %s", title));    dest.type = type;    dest.flag = pjsip_transport_get_flag_from_type(type);    dest.addr.host = pj_str(name);    dest.addr.port = port;    result.status = 0x12345678;    pjsip_endpt_resolve(endpt, pool, &dest, &result, &cb);

⌨️ 快捷键说明

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