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

📄 dns_test.c

📁 基于sip协议的网络电话源码
💻 C
📖 第 1 页 / 共 2 页
字号:
    while (result.status == 0x12345678) {	int i = 0;	pj_time_val timeout = { 1, 0 };	pjsip_endpt_handle_events(endpt, &timeout);	if (i == 1)	    pj_dns_resolver_dump(pjsip_endpt_get_resolver(endpt), PJ_TRUE);    }    if (result.status != PJ_SUCCESS) {	app_perror("  pjsip_endpt_resolve() error", result.status);	return result.status;    }    if (ref) {	unsigned i;	if (ref->count != result.servers.count) {	    PJ_LOG(3,(THIS_FILE, "  test_resolve() error 10: result count mismatch"));	    return 10;	}		for (i=0; i<ref->count; ++i) {	    pj_sockaddr_in *ra = (pj_sockaddr_in *)&ref->entry[i].addr;	    pj_sockaddr_in *rb = (pj_sockaddr_in *)&result.servers.entry[i].addr;	    if (ra->sin_addr.s_addr != rb->sin_addr.s_addr) {		PJ_LOG(3,(THIS_FILE, "  test_resolve() error 20: IP address mismatch"));		return 20;	    }	    if (ra->sin_port != rb->sin_port) {		PJ_LOG(3,(THIS_FILE, "  test_resolve() error 30: port mismatch"));		return 30;	    }	    if (ref->entry[i].addr_len != result.servers.entry[i].addr_len) {		PJ_LOG(3,(THIS_FILE, "  test_resolve() error 40: addr_len mismatch"));		return 40;	    }	    if (ref->entry[i].type != result.servers.entry[i].type) {		PJ_LOG(3,(THIS_FILE, "  test_resolve() error 50: transport type mismatch"));		return 50;	    }	}    }    return PJ_SUCCESS;}/* * Perform round-robin/load balance test. */static int round_robin_test(pj_pool_t *pool){    enum { COUNT = 400, PCT_ALLOWANCE = 5 };    unsigned i;    struct server_hit    {	char *ip_addr;	unsigned percent;	unsigned hits;    } server_hit[] =    {	{ "1.1.1.1", 3,  0 },	{ "2.2.2.2", 65, 0 },	{ "3.3.3.3", 32, 0 },	{ "4.4.4.4", 0,  0 }    };    PJ_LOG(3,(THIS_FILE, " Performing round-robin/load-balance test.."));    /* Do multiple resolve request to "example.com".     * The resolver should select the server based on the weight proportion     * the the servers in the SRV entry.     */    for (i=0; i<COUNT; ++i) {	pjsip_host_info dest;	struct result result;	unsigned j;	dest.type = PJSIP_TRANSPORT_UDP;	dest.flag = pjsip_transport_get_flag_from_type(PJSIP_TRANSPORT_UDP);	dest.addr.host = pj_str("example.com");	dest.addr.port = 0;	result.status = 0x12345678;	pjsip_endpt_resolve(endpt, pool, &dest, &result, &cb);	while (result.status == 0x12345678) {	    int i = 0;	    pj_time_val timeout = { 1, 0 };	    pjsip_endpt_handle_events(endpt, &timeout);	    if (i == 1)		pj_dns_resolver_dump(pjsip_endpt_get_resolver(endpt), PJ_TRUE);	}	/* Find which server was "hit" */	for (j=0; j<PJ_ARRAY_SIZE(server_hit); ++j) {	    pj_str_t tmp;	    pj_in_addr a1;	    pj_sockaddr_in *a2;	    tmp = pj_str(server_hit[j].ip_addr);	    a1 = pj_inet_addr(&tmp);	    a2 = (pj_sockaddr_in*) &result.servers.entry[0].addr;	    if (a1.s_addr == a2->sin_addr.s_addr) {		server_hit[j].hits++;		break;	    }	}	if (j == PJ_ARRAY_SIZE(server_hit)) {	    PJ_LOG(1,(THIS_FILE, "..round_robin_test() error 10: returned address mismatch"));	    return 10;	}    }    /* Print the actual hit rate */    for (i=0; i<PJ_ARRAY_SIZE(server_hit); ++i) {	PJ_LOG(3,(THIS_FILE, " ..Server %s: weight=%d%%, hit %d%% times",		  server_hit[i].ip_addr, server_hit[i].percent,		  (server_hit[i].hits * 100) / COUNT));    }    /* Compare the actual hit with the weight proportion */    for (i=0; i<PJ_ARRAY_SIZE(server_hit); ++i) {	int actual_pct = (server_hit[i].hits * 100) / COUNT;	if (actual_pct + PCT_ALLOWANCE < (int)server_hit[i].percent ||	    actual_pct - PCT_ALLOWANCE > (int)server_hit[i].percent)	{	    PJ_LOG(1,(THIS_FILE, 		      "..round_robin_test() error 20: "		      "hit rate difference for server %s (%d%%) is more than "		      "tolerable allowance (%d%%)",		      server_hit[i].ip_addr, 		      actual_pct - server_hit[i].percent, 		      PCT_ALLOWANCE));	    return 20;	}    }    PJ_LOG(3,(THIS_FILE, 	      " Load balance test success, hit-rate is "	      "within %d%% allowance", PCT_ALLOWANCE));    return PJ_SUCCESS;}#define C(expr)	    status = expr; \		    if (status != PJ_SUCCESS) app_perror(THIS_FILE, "Error", status);static void add_ref(pjsip_server_addresses *r,		    pjsip_transport_type_e type,		    char *addr,		    int port){    pj_sockaddr_in *a;    pj_str_t tmp;    r->entry[r->count].type = type;    r->entry[r->count].priority = 0;    r->entry[r->count].weight = 0;    r->entry[r->count].addr_len = sizeof(pj_sockaddr_in);    a = (pj_sockaddr_in *)&r->entry[r->count].addr;    a->sin_family = PJ_AF_INET;    tmp = pj_str(addr);    a->sin_addr = pj_inet_addr(&tmp);    a->sin_port = pj_htons((pj_uint16_t)port);    r->count++;}static void create_ref(pjsip_server_addresses *r,		       pjsip_transport_type_e type,		       char *addr,		       int port){    r->count = 0;    add_ref(r, type, addr, port);}/* * Main test entry. */int resolve_test(void){    pj_pool_t *pool;    pj_dns_resolver *resv;    pj_str_t nameserver;    pj_uint16_t port = 5353;    pj_status_t status;    pool = pjsip_endpt_create_pool(endpt, NULL, 4000, 4000);    status = pjsip_endpt_create_resolver(endpt, &resv);    nameserver = pj_str("192.168.0.106");    pj_dns_resolver_set_ns(resv, 1, &nameserver, &port);    pjsip_endpt_set_resolver(endpt, resv);    add_dns_entries(resv);    /* These all should be resolved as IP addresses (DNS A query) */    {	pjsip_server_addresses ref;	create_ref(&ref, PJSIP_TRANSPORT_UDP, "1.1.1.1", 5060);	status = test_resolve("IP address without transport and port", pool, PJSIP_TRANSPORT_UNSPECIFIED, "1.1.1.1", 0, &ref);	if (status != PJ_SUCCESS)	    return -100;    }    {	pjsip_server_addresses ref;	create_ref(&ref, PJSIP_TRANSPORT_UDP, "1.1.1.1", 5060);	status = test_resolve("IP address with explicit port", pool, PJSIP_TRANSPORT_UNSPECIFIED, "1.1.1.1", 5060, &ref);	if (status != PJ_SUCCESS)	    return -110;    }    {	pjsip_server_addresses ref;	create_ref(&ref, PJSIP_TRANSPORT_TCP, "1.1.1.1", 5060);	status = test_resolve("IP address without port (TCP)", pool, PJSIP_TRANSPORT_TCP,"1.1.1.1", 0, &ref);	if (status != PJ_SUCCESS)	    return -120;    }    {	pjsip_server_addresses ref;	create_ref(&ref, PJSIP_TRANSPORT_TLS, "1.1.1.1", 5061);	status = test_resolve("IP address without port (TLS)", pool, PJSIP_TRANSPORT_TLS, "1.1.1.1", 0, &ref);	if (status != PJ_SUCCESS)	    return -130;    }    /* This should be resolved as DNS A record (because port is present) */    {	pjsip_server_addresses ref;	create_ref(&ref, PJSIP_TRANSPORT_UDP, "5.5.5.5", 5060);	status = test_resolve("domain name with port should resolve to A record", pool, PJSIP_TRANSPORT_UNSPECIFIED, "example.com", 5060, &ref);	if (status != PJ_SUCCESS)	    return -140;    }    /* This will fail to be resolved as SRV, resolver should fallback to      * resolving to A record.     */    {	pjsip_server_addresses ref;	create_ref(&ref, PJSIP_TRANSPORT_UDP, "2.2.2.2", 5060);	status = test_resolve("failure with SRV fallback to A record", pool, PJSIP_TRANSPORT_UNSPECIFIED, "sip02.example.com", 0, &ref);	if (status != PJ_SUCCESS)	    return -150;    }    /* Same as above, but explicitly for TLS. */    {	pjsip_server_addresses ref;	create_ref(&ref, PJSIP_TRANSPORT_TLS, "2.2.2.2", 5061);	status = test_resolve("failure with SRV fallback to A record (for TLS)", pool, PJSIP_TRANSPORT_TLS, "sip02.example.com", 0, &ref);	if (status != PJ_SUCCESS)	    return -150;    }    /* Standard DNS SRV followed by A recolution */    {	pjsip_server_addresses ref;	create_ref(&ref, PJSIP_TRANSPORT_UDP, "6.6.6.6", 50060);	status = test_resolve("standard SRV resolution", pool, PJSIP_TRANSPORT_UNSPECIFIED, "domain.com", 0, &ref);	if (status != PJ_SUCCESS)	    return -155;    }    /* Standard DNS SRV followed by A recolution (explicit transport) */    {	pjsip_server_addresses ref;	create_ref(&ref, PJSIP_TRANSPORT_TCP, "6.6.6.6", 50060);	add_ref(&ref, PJSIP_TRANSPORT_TCP, "7.7.7.7", 50060);	status = test_resolve("standard SRV resolution with explicit transport (TCP)", pool, PJSIP_TRANSPORT_TCP, "domain.com", 0, &ref);	if (status != PJ_SUCCESS)	    return -160;    }    /* Round robin/load balance test */    if (round_robin_test(pool) != 0)	return -170;    /* Timeout test */    {	status = test_resolve("timeout test", pool, PJSIP_TRANSPORT_UNSPECIFIED, "an.invalid.address", 0, NULL);	if (status == PJ_SUCCESS)	    return -150;    }    return 0;}

⌨️ 快捷键说明

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