本文整理汇总了C++中pj_sockaddr_get_port函数 的典型用法代码示例。如果您正苦于以下问题:C++ pj_sockaddr_get_port函数的具体用法?C++ pj_sockaddr_get_port怎么用?C++ pj_sockaddr_get_port使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了pj_sockaddr_get_port函数 的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: tcp_start_read
/*
* This utility function creates receive data buffers and start
* asynchronous recv() operations from the socket. It is called after
* accept() or connect() operation complete.
*/
static pj_status_t tcp_start_read(struct tcp_transport *tcp)
{
pj_pool_t *pool;
pj_ssize_t size;
pj_sockaddr *rem_addr;
void *readbuf[1];
pj_status_t status;
/* Init rdata */
pool = pjsip_endpt_create_pool(tcp->base.endpt,
"rtd%p",
PJSIP_POOL_RDATA_LEN,
PJSIP_POOL_RDATA_INC);
if (!pool) {
tcp_perror(tcp->base.obj_name, "Unable to create pool", PJ_ENOMEM);
return PJ_ENOMEM;
}
tcp->rdata.tp_info.pool = pool;
tcp->rdata.tp_info.transport = &tcp->base;
tcp->rdata.tp_info.tp_data = tcp;
tcp->rdata.tp_info.op_key.rdata = &tcp->rdata;
pj_ioqueue_op_key_init(&tcp->rdata.tp_info.op_key.op_key,
sizeof(pj_ioqueue_op_key_t));
tcp->rdata.pkt_info.src_addr = tcp->base.key.rem_addr;
tcp->rdata.pkt_info.src_addr_len = sizeof(tcp->rdata.pkt_info.src_addr);
rem_addr = &tcp->base.key.rem_addr;
pj_sockaddr_print(rem_addr, tcp->rdata.pkt_info.src_name,
sizeof(tcp->rdata.pkt_info.src_name), 0);
tcp->rdata.pkt_info.src_port = pj_sockaddr_get_port(rem_addr);
size = sizeof(tcp->rdata.pkt_info.packet);
readbuf[0] = tcp->rdata.pkt_info.packet;
status = pj_activesock_start_read2(tcp->asock, tcp->base.pool, size,
readbuf, 0);
if (status != PJ_SUCCESS && status != PJ_EPENDING) {
PJ_LOG(4, (tcp->base.obj_name,
"pj_activesock_start_read() error, status=%d",
status));
return status;
}
return PJ_SUCCESS;
}
开发者ID:ChrisKwon, 项目名称:spore, 代码行数:51, 代码来源:sip_transport_tcp.c
示例2: init_sdp_media
/* Common initialization for both audio and video SDP media line */
static pj_status_t init_sdp_media(pjmedia_sdp_media *m,
pj_pool_t *pool,
const pj_str_t *media_type,
const pjmedia_sock_info *sock_info)
{
char tmp_addr[PJ_INET6_ADDRSTRLEN];
pjmedia_sdp_attr *attr;
const pj_sockaddr *addr;
pj_strdup(pool, &m->desc.media, media_type);
addr = &sock_info->rtp_addr_name;
/* Validate address family */
PJ_ASSERT_RETURN(addr->addr.sa_family == pj_AF_INET() ||
addr->addr.sa_family == pj_AF_INET6(),
PJ_EAFNOTSUP);
/* SDP connection line */
m->conn = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_conn);
m->conn->net_type = STR_IN;
m->conn->addr_type = (addr->addr.sa_family==pj_AF_INET())? STR_IP4:STR_IP6;
pj_sockaddr_print(addr, tmp_addr, sizeof(tmp_addr), 0);
pj_strdup2(pool, &m->conn->addr, tmp_addr);
/* Port and transport in media description */
m->desc.port = pj_sockaddr_get_port(addr);
m->desc.port_count = 1;
pj_strdup (pool, &m->desc.transport, &STR_RTP_AVP);
/* Add "rtcp" attribute */
#if defined(PJMEDIA_HAS_RTCP_IN_SDP) && PJMEDIA_HAS_RTCP_IN_SDP!=0
if (sock_info->rtcp_addr_name.addr.sa_family != 0) {
attr = pjmedia_sdp_attr_create_rtcp(pool, &sock_info->rtcp_addr_name);
if (attr)
pjmedia_sdp_attr_add(&m->attr_count, m->attr, attr);
}
#endif
/* Add sendrecv attribute. */
attr = PJ_POOL_ZALLOC_T(pool, pjmedia_sdp_attr);
attr->name = STR_SENDRECV;
m->attr[m->attr_count++] = attr;
return PJ_SUCCESS;
}
开发者ID:silvansky, 项目名称:pjsip_mod, 代码行数:47, 代码来源:endpoint.c
示例3: PJ_DEF
/*
* Print socket address.
*/
PJ_DEF(char*) pj_sockaddr_print( const pj_sockaddr_t *addr,
char *buf, int size,
unsigned flags)
{
enum {
WITH_PORT = 1,
WITH_BRACKETS = 2
};
char txt[PJ_INET6_ADDRSTRLEN];
char port[32];
const pj_addr_hdr *h = (const pj_addr_hdr*)addr;
char *bquote, *equote;
pj_status_t status;
status = pj_inet_ntop(h->sa_family, pj_sockaddr_get_addr(addr),
txt, sizeof(txt));
if (status != PJ_SUCCESS)
return "";
if (h->sa_family != PJ_AF_INET6 || (flags & WITH_BRACKETS)==0) {
bquote = ""; equote = "";
} else {
bquote = "["; equote = "]";
}
if (flags & WITH_PORT) {
pj_ansi_snprintf(port, sizeof(port), ":%d",
pj_sockaddr_get_port(addr));
} else {
port[0] = '\0';
}
pj_ansi_snprintf(buf, size, "%s%s%s%s",
bquote, txt, equote, port);
return buf;
}
开发者ID:Antares84, 项目名称:asuswrt-merlin, 代码行数:41, 代码来源:sock_common.c
示例4: regc_test
//.........这里部分代码省略.........
*/
{
ON_OFF, /* check_contact */
ON_OFF, /* add_xuid_param */
"no Contact and no Expires", /* title */
NULL, /* alt_registrar */
1, /* contact cnt */
{ "<sip:[email protected]:5060>" },/* contacts[] */
600, /* expires */
/* registrar config: */
/* respond code auth contact exp_prm expires more_contacts */
{ PJ_TRUE, 200, PJ_FALSE, NONE, 0, 0, {NULL, 0}},
/* client expected results: */
/* error code have_reg expiration contact_cnt auth?*/
{ PJ_FALSE, 200, PJ_TRUE, 600, 0, PJ_FALSE}
},
};
unsigned i;
pj_sockaddr_in addr;
pjsip_transport *udp = NULL;
pj_uint16_t port;
char registrar_uri_buf[80];
pj_str_t registrar_uri;
int rc = 0;
pj_sockaddr_in_init(&addr, 0, 0);
/* Acquire existing transport, if any */
rc = pjsip_endpt_acquire_transport(endpt, PJSIP_TRANSPORT_UDP, &addr, sizeof(addr), NULL, &udp);
if (rc == PJ_SUCCESS) {
port = pj_sockaddr_get_port(&udp->local_addr);
pjsip_transport_dec_ref(udp);
udp = NULL;
} else {
rc = pjsip_udp_transport_start(endpt, NULL, NULL, 1, &udp);
if (rc != PJ_SUCCESS) {
app_perror(" error creating UDP transport", rc);
rc = -2;
goto on_return;
}
port = pj_sockaddr_get_port(&udp->local_addr);
}
/* Register registrar module */
rc = pjsip_endpt_register_module(endpt, ®istrar.mod);
if (rc != PJ_SUCCESS) {
app_perror(" error registering module", rc);
rc = -3;
goto on_return;
}
/* Register send module */
rc = pjsip_endpt_register_module(endpt, &send_mod.mod);
if (rc != PJ_SUCCESS) {
app_perror(" error registering module", rc);
rc = -3;
goto on_return;
}
pj_ansi_snprintf(registrar_uri_buf, sizeof(registrar_uri_buf),
"sip:127.0.0.1:%d", (int)port);
registrar_uri = pj_str(registrar_uri_buf);
开发者ID:championlovecode, 项目名称:pjsip, 代码行数:67, 代码来源:regc_test.c
示例5: lis_create_transport
//.........这里部分代码省略.........
switch(listener->tls_setting.method) {
case PJSIP_TLSV1_METHOD:
ssock_param.proto = PJ_SSL_SOCK_PROTO_TLS1;
break;
case PJSIP_SSLV2_METHOD:
ssock_param.proto = PJ_SSL_SOCK_PROTO_SSL2;
break;
case PJSIP_SSLV3_METHOD:
ssock_param.proto = PJ_SSL_SOCK_PROTO_SSL3;
break;
case PJSIP_SSLV23_METHOD:
ssock_param.proto = PJ_SSL_SOCK_PROTO_SSL23;
break;
default:
ssock_param.proto = PJ_SSL_SOCK_PROTO_DEFAULT;
break;
}
status = pj_ssl_sock_create(pool, &ssock_param, &ssock);
if (status != PJ_SUCCESS)
return status;
/* Apply SSL certificate */
if (listener->cert) {
status = pj_ssl_sock_set_certificate(ssock, pool, listener->cert);
if (status != PJ_SUCCESS)
return status;
}
/* Initially set bind address to PJ_INADDR_ANY port 0 */
pj_sockaddr_in_init(&local_addr, NULL, 0);
/* Create the transport descriptor */
status = tls_create(listener, pool, ssock, PJ_FALSE, &local_addr,
(pj_sockaddr_in*)rem_addr, &remote_name, &tls);
if (status != PJ_SUCCESS)
return status;
/* Set the "pending" SSL socket user data */
pj_ssl_sock_set_user_data(tls->ssock, tls);
/* Start asynchronous connect() operation */
tls->has_pending_connect = PJ_TRUE;
status = pj_ssl_sock_start_connect(tls->ssock, tls->base.pool,
(pj_sockaddr_t*)&local_addr,
(pj_sockaddr_t*)rem_addr,
addr_len);
if (status == PJ_SUCCESS) {
on_connect_complete(tls->ssock, PJ_SUCCESS);
} else if (status != PJ_EPENDING) {
tls_destroy(&tls->base, status);
return status;
}
if (tls->has_pending_connect) {
pj_ssl_sock_info info;
/* Update local address, just in case local address currently set is
* different now that asynchronous connect() is started.
*/
/* Retrieve the bound address */
status = pj_ssl_sock_get_info(tls->ssock, &info);
if (status == PJ_SUCCESS) {
pj_uint16_t new_port;
new_port = pj_sockaddr_get_port((pj_sockaddr_t*)&info.local_addr);
if (pj_sockaddr_has_addr((pj_sockaddr_t*)&info.local_addr)) {
/* Update sockaddr */
pj_sockaddr_cp((pj_sockaddr_t*)&tls->base.local_addr,
(pj_sockaddr_t*)&info.local_addr);
} else if (new_port && new_port != pj_sockaddr_get_port(
(pj_sockaddr_t*)&tls->base.local_addr))
{
/* Update port only */
pj_sockaddr_set_port(&tls->base.local_addr,
new_port);
}
sockaddr_to_host_port(tls->base.pool, &tls->base.local_name,
(pj_sockaddr_in*)&tls->base.local_addr);
}
PJ_LOG(4,(tls->base.obj_name,
"TLS transport %.*s:%d is connecting to %.*s:%d...",
(int)tls->base.local_name.host.slen,
tls->base.local_name.host.ptr,
tls->base.local_name.port,
(int)tls->base.remote_name.host.slen,
tls->base.remote_name.host.ptr,
tls->base.remote_name.port));
}
/* Done */
*p_transport = &tls->base;
return PJ_SUCCESS;
}
开发者ID:conght, 项目名称:BLM-Lib, 代码行数:101, 代码来源:sip_transport_tls.c
示例6: krx_ice_start_session
int krx_ice_start_session(krx_ice* k) {
pj_status_t r;
if(!k) { return - 1; }
if(!k->ice_st) { return -2; }
if(pj_ice_strans_has_sess(k->ice_st)) {
printf("Error: ice already has a session.\n");
return -3;
}
r = pj_ice_strans_init_ice(k->ice_st, PJ_ICE_SESS_ROLE_CONTROLLED, NULL, NULL);
if(r != PJ_SUCCESS) {
printf("Error: cannot initialize an ice session.\n");
return -4;
}
/* this is where we can create an sdp */
char sdp_buf[8096] = { 0 } ;
sprintf(sdp_buf,
"v=0\n"
"o=- 123456789 34234324 IN IP4 localhost\n" /* - [identifier] [session version] IN IP4 localhost */
"s=krx_ice\n" /* software */
"t=0 0\n" /* start, ending time */
"a=ice-ufrag:%s\n"
"a=ice-pwd:%s\n"
,
k->ice_ufrag,
k->ice_pwd
);
/* write each component */
for(int i = 0; i < k->ncomp; ++i) {
pj_ice_sess_cand cand[PJ_ICE_ST_MAX_CAND] = { 0 } ;
char ipaddr[PJ_INET6_ADDRSTRLEN] = { 0 } ;
/* get default candidate for component, note that compoments start numbering from 1, not zero. */
r = pj_ice_strans_get_def_cand(k->ice_st, 1, &cand[0]);
if(r != PJ_SUCCESS) {
printf("Error: cannot retrieve default candidate for component: %d\n", i+1);
continue;
}
if(i == 0) {
int offset = strlen(sdp_buf);
sprintf(sdp_buf + offset,
"m=video %d RTP/SAVPF 120\n"
"c=IN IP4 %s\n"
,
(int)pj_sockaddr_get_port(&cand[0].addr),
pj_sockaddr_print(&cand[0].addr, ipaddr, sizeof(ipaddr), 0)
);
/* print all candidates */
unsigned num_cands = PJ_ARRAY_SIZE(cand);
printf("Found number of candidates: %d\n", num_cands);
// (ice_st && ice_st->ice && comp_id && comp_id <= ice_st->comp_cnt && count && cand),
printf("ice: %p\n", k->ice_st);
r = pj_ice_strans_enum_cands(k->ice_st, i + 1, &num_cands, cand);
if(r != PJ_SUCCESS) {
printf("Error: cannot retrieve candidates.\n");
exit(1);
}
#if 1
for(int j = 0; j < num_cands; ++j) {
int offset = strlen(sdp_buf);
char* start_addr = sdp_buf + offset;
krx_ice_candidate_to_string(sdp_buf, sizeof(sdp_buf)-offset, &cand[j]);
char* end_addr = sdp_buf + strlen(sdp_buf);
printf("--------\n%s\n--------------\n", sdp_buf);
}
offset = strlen(sdp_buf);
char* start_addr = sdp_buf + offset;
krx_ice_candidate_to_string(sdp_buf + offset, sizeof(sdp_buf)-offset, &cand[1]);
char* end_addr = sdp_buf + strlen(sdp_buf);
#endif
}
}
printf("SDP: %s\n", sdp_buf);
r = pj_ice_strans_init_ice(k->ice_st, PJ_ICE_SESS_ROLE_CONTROLLED, NULL, NULL);
CHECK_PJ_STATUS(r, "Error: cannot init ice session.\n", -4);
return 0;
}
开发者ID:roxlu, 项目名称:krx_rtc, 代码行数:98, 代码来源:krx_pjnath_ice.c
示例7: encode_session
/*
* Encode ICE information in SDP.
*/
static int encode_session(char buffer[], unsigned maxlen)
{
char *p = buffer;
unsigned comp;
int printed;
pj_str_t local_ufrag, local_pwd;
pj_status_t status;
/* Write "dummy" SDP v=, o=, s=, and t= lines */
PRINT("v=0\no=- 3414953978 3414953978 IN IP4 localhost\ns=ice\nt=0 0\n",
0, 0, 0, 0, 0, 0);
/* Get ufrag and pwd from current session */
pj_ice_strans_get_ufrag_pwd(icedemo.icest, &local_ufrag, &local_pwd,
NULL, NULL);
/* Write the a=ice-ufrag and a=ice-pwd attributes */
PRINT("a=ice-ufrag:%.*s\na=ice-pwd:%.*s\n",
(int)local_ufrag.slen,
local_ufrag.ptr,
(int)local_pwd.slen,
local_pwd.ptr,
0, 0);
/* Write each component */
for (comp=0; comp<icedemo.opt.comp_cnt; ++comp) {
unsigned j, cand_cnt;
pj_ice_sess_cand cand[PJ_ICE_ST_MAX_CAND];
char ipaddr[PJ_INET6_ADDRSTRLEN];
/* Get default candidate for the component */
status = pj_ice_strans_get_def_cand(icedemo.icest, comp+1, &cand[0]);
if (status != PJ_SUCCESS)
return -status;
/* Write the default address */
if (comp==0) {
/* For component 1, default address is in m= and c= lines */
PRINT("m=audio %d RTP/AVP 0\n"
"c=IN IP4 %s\n",
(int)pj_sockaddr_get_port(&cand[0].addr),
pj_sockaddr_print(&cand[0].addr, ipaddr,
sizeof(ipaddr), 0),
0, 0, 0, 0);
} else if (comp==1) {
/* For component 2, default address is in a=rtcp line */
PRINT("a=rtcp:%d IN IP4 %s\n",
(int)pj_sockaddr_get_port(&cand[0].addr),
pj_sockaddr_print(&cand[0].addr, ipaddr,
sizeof(ipaddr), 0),
0, 0, 0, 0);
} else {
/* For other components, we'll just invent this.. */
PRINT("a=Xice-defcand:%d IN IP4 %s\n",
(int)pj_sockaddr_get_port(&cand[0].addr),
pj_sockaddr_print(&cand[0].addr, ipaddr,
sizeof(ipaddr), 0),
0, 0, 0, 0);
}
/* Enumerate all candidates for this component */
status = pj_ice_strans_enum_cands(icedemo.icest, comp+1,
&cand_cnt, cand);
if (status != PJ_SUCCESS)
return -status;
/* And encode the candidates as SDP */
for (j=0; j<cand_cnt; ++j) {
printed = print_cand(p, maxlen - (p-buffer), &cand[j]);
if (printed < 0)
return -PJ_ETOOSMALL;
p += printed;
}
}
if (p == buffer+maxlen)
return -PJ_ETOOSMALL;
*p = '\0';
return p - buffer;
}
开发者ID:conght, 项目名称:BLM-Lib, 代码行数:84, 代码来源:icedemo.c
示例8: stun_destroy_test
static int stun_destroy_test(void)
{
enum { LOOP = 500 };
struct stun_test_session test_sess;
pj_sockaddr bind_addr;
int addr_len;
pj_caching_pool cp;
pj_pool_t *pool;
unsigned i;
pj_status_t status;
int rc = 0;
PJ_LOG(3,(THIS_FILE, " STUN destroy concurrency test"));
pj_bzero(&test_sess, sizeof(test_sess));
pj_caching_pool_init(&cp, NULL, 0);
pool = pj_pool_create(&cp.factory, "testsess", 512, 512, NULL);
pj_stun_config_init(&test_sess.stun_cfg, &cp.factory, 0, NULL, NULL);
status = pj_timer_heap_create(pool, 1023, &test_sess.stun_cfg.timer_heap);
pj_assert(status == PJ_SUCCESS);
status = pj_lock_create_recursive_mutex(pool, NULL, &test_sess.lock);
pj_assert(status == PJ_SUCCESS);
pj_timer_heap_set_lock(test_sess.stun_cfg.timer_heap, test_sess.lock, PJ_TRUE);
pj_assert(status == PJ_SUCCESS);
status = pj_ioqueue_create(pool, 512, &test_sess.stun_cfg.ioqueue);
pj_assert(status == PJ_SUCCESS);
pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, &test_sess.server_sock);
pj_sockaddr_init(pj_AF_INET(), &bind_addr, NULL, 0);
status = pj_sock_bind(test_sess.server_sock, &bind_addr, pj_sockaddr_get_len(&bind_addr));
pj_assert(status == PJ_SUCCESS);
addr_len = sizeof(bind_addr);
status = pj_sock_getsockname(test_sess.server_sock, &bind_addr, &addr_len);
pj_assert(status == PJ_SUCCESS);
test_sess.server_port = pj_sockaddr_get_port(&bind_addr);
status = pj_event_create(pool, NULL, PJ_TRUE, PJ_FALSE, &test_sess.server_event);
pj_assert(status == PJ_SUCCESS);
for (i=0; i<SERVER_THREAD_CNT; ++i) {
status = pj_thread_create(pool, NULL,
&server_thread_proc, &test_sess,
0, 0, &test_sess.server_threads[i]);
pj_assert(status == PJ_SUCCESS);
}
for (i=0; i<WORKER_THREAD_CNT; ++i) {
status = pj_thread_create(pool, NULL,
&worker_thread_proc, &test_sess,
0, 0, &test_sess.worker_threads[i]);
pj_assert(status == PJ_SUCCESS);
}
/* Test 1: Main thread calls destroy while callback is processing response */
PJ_LOG(3,(THIS_FILE, " Destroy in main thread while callback is running"));
for (i=0; i<LOOP; ++i) {
int sleep = pj_rand() % 5;
PJ_LOG(3,(THIS_FILE, " Try %-3d of %d", i+1, LOOP));
/* Test 1: destroy at the same time when receiving response */
pj_bzero(&test_sess.param, sizeof(test_sess.param));
test_sess.param.client_sleep_after_start = 20;
test_sess.param.client_sleep_before_destroy = sleep;
test_sess.param.server_wait_for_event = PJ_TRUE;
stun_destroy_test_session(&test_sess);
PJ_LOG(3,(THIS_FILE,
" stun test a: sleep delay:%d: clients with response: %d",
sleep, test_sess.param.client_got_response));
/* Test 2: destroy at the same time with STUN retransmit timer */
test_sess.param.server_drop_request = PJ_TRUE;
test_sess.param.client_sleep_after_start = 0;
test_sess.param.client_sleep_before_destroy = PJ_STUN_RTO_VALUE;
test_sess.param.server_wait_for_event = PJ_FALSE;
stun_destroy_test_session(&test_sess);
PJ_LOG(3,(THIS_FILE, " stun test b: retransmit concurrency"));
/* Test 3: destroy at the same time with receiving response
* AND STUN retransmit timer */
test_sess.param.client_got_response = 0;
test_sess.param.server_drop_request = PJ_FALSE;
test_sess.param.client_sleep_after_start = PJ_STUN_RTO_VALUE;
test_sess.param.client_sleep_before_destroy = 0;
test_sess.param.server_wait_for_event = PJ_TRUE;
stun_destroy_test_session(&test_sess);
PJ_LOG(3,(THIS_FILE,
" stun test c: clients with response: %d",
test_sess.param.client_got_response));
pj_thread_sleep(10);
//.........这里部分代码省略.........
开发者ID:AmoebaLabs, 项目名称:pjsip, 代码行数:101, 代码来源:concur_test.c
示例9: PJ_DEF
//.........这里部分代码省略.........
}
/* No need to do anything else if stream is rejected */
if (local_m->desc.port == 0) {
return PJ_SUCCESS;
}
/* If "rtcp" attribute is present in the SDP, set the RTCP address
* from that attribute. Otherwise, calculate from RTP address.
*/
attr = pjmedia_sdp_attr_find2(rem_m->attr_count, rem_m->attr,
"rtcp", NULL);
if (attr) {
pjmedia_sdp_rtcp_attr rtcp;
status = pjmedia_sdp_attr_get_rtcp(attr, &rtcp);
if (status == PJ_SUCCESS) {
if (rtcp.addr.slen) {
status = pj_sockaddr_init(rem_af, &si->rem_rtcp, &rtcp.addr,
(pj_uint16_t)rtcp.port);
} else {
pj_sockaddr_init(rem_af, &si->rem_rtcp, NULL,
(pj_uint16_t)rtcp.port);
pj_memcpy(pj_sockaddr_get_addr(&si->rem_rtcp),
pj_sockaddr_get_addr(&si->rem_addr),
pj_sockaddr_get_addr_len(&si->rem_addr));
}
}
}
if (!pj_sockaddr_has_addr(&si->rem_rtcp)) {
int rtcp_port;
pj_memcpy(&si->rem_rtcp, &si->rem_addr, sizeof(pj_sockaddr));
rtcp_port = pj_sockaddr_get_port(&si->rem_addr) + 1;
pj_sockaddr_set_port(&si->rem_rtcp, (pj_uint16_t)rtcp_port);
}
/* Get the payload number for receive channel. */
/*
Previously we used to rely on fmt[0] being the selected codec,
but some UA sends telephone-event as fmt[0] and this would
cause assert failure below.
Thanks Chris Hamilton <chamilton .at. cs.dal.ca> for this patch.
// And codec must be numeric!
if (!pj_isdigit(*local_m->desc.fmt[0].ptr) ||
!pj_isdigit(*rem_m->desc.fmt[0].ptr))
{
return PJMEDIA_EINVALIDPT;
}
pt = pj_strtoul(&local_m->desc.fmt[0]);
pj_assert(PJMEDIA_RTP_PT_TELEPHONE_EVENTS==0 ||
pt != PJMEDIA_RTP_PT_TELEPHONE_EVENTS);
*/
/* This is to suppress MSVC warning about uninitialized var */
pt = 0;
/* Find the first codec which is not telephone-event */
for ( fmti = 0; fmti < local_m->desc.fmt_count; ++fmti ) {
if ( !pj_isdigit(*local_m->desc.fmt[fmti].ptr) )
return PJMEDIA_EINVALIDPT;
pt = pj_strtoul(&local_m->desc.fmt[fmti]);
开发者ID:max3903, 项目名称:SFLphone, 代码行数:67, 代码来源:session.c
示例10: pool_
//.........这里部分代码省略.........
trData_.self = this;
if (not ice or not ice->isRunning())
throw std::logic_error("ice transport must exist and negotiation completed");
RING_DBG("[email protected]%p {tr=%p}", this, &trData_.base);
auto& base = trData_.base;
pool_.reset(pjsip_endpt_create_pool(endpt, "SipIceTransport.pool", POOL_TP_INIT, POOL_TP_INC));
if (not pool_)
throw std::bad_alloc();
auto pool = pool_.get();
pj_ansi_snprintf(base.obj_name, PJ_MAX_OBJ_NAME, "SipIceTransport");
base.endpt = endpt;
base.tpmgr = pjsip_endpt_get_tpmgr(endpt);
base.pool = pool;
rdata_.tp_info.pool = pool;
// FIXME: not destroyed in case of exception
if (pj_atomic_create(pool, 0, &base.ref_cnt) != PJ_SUCCESS)
throw std::runtime_error("Can't create PJSIP atomic.");
// FIXME: not destroyed in case of exception
if (pj_lock_create_recursive_mutex(pool, "SipIceTransport.mutex", &base.lock) != PJ_SUCCESS)
throw std::runtime_error("Can't create PJSIP mutex.");
auto remote = ice->getRemoteAddress(comp_id);
RING_DBG("SipIceTransport: remote is %s", remote.toString(true).c_str());
pj_sockaddr_cp(&base.key.rem_addr, remote.pjPtr());
base.key.type = PJSIP_TRANSPORT_UDP;//t_type;
base.type_name = (char*)pjsip_transport_get_type_name((pjsip_transport_type_e)base.key.type);
base.flag = pjsip_transport_get_flag_from_type((pjsip_transport_type_e)base.key.type);
base.info = (char*) pj_pool_alloc(pool, TRANSPORT_INFO_LENGTH);
char print_addr[PJ_INET6_ADDRSTRLEN+10];
pj_ansi_snprintf(base.info, TRANSPORT_INFO_LENGTH, "%s to %s",
base.type_name,
pj_sockaddr_print(remote.pjPtr(), print_addr,
sizeof(print_addr), 3));
base.addr_len = remote.getLength();
base.dir = PJSIP_TP_DIR_NONE;//is_server? PJSIP_TP_DIR_INCOMING : PJSIP_TP_DIR_OUTGOING;
base.data = nullptr;
/* Set initial local address */
auto local = ice->getDefaultLocalAddress();
pj_sockaddr_cp(&base.local_addr, local.pjPtr());
sockaddr_to_host_port(pool, &base.local_name, &base.local_addr);
sockaddr_to_host_port(pool, &base.remote_name, remote.pjPtr());
base.send_msg = [](pjsip_transport *transport,
pjsip_tx_data *tdata,
const pj_sockaddr_t *rem_addr, int addr_len,
void *token, pjsip_transport_callback callback) {
auto& this_ = reinterpret_cast<TransportData*>(transport)->self;
return this_->send(tdata, rem_addr, addr_len, token, callback);
};
base.do_shutdown = [](pjsip_transport *transport) -> pj_status_t {
auto& this_ = reinterpret_cast<TransportData*>(transport)->self;
RING_WARN("[email protected]%p: shutdown", this_);
return PJ_SUCCESS;
};
base.destroy = [](pjsip_transport *transport) -> pj_status_t {
auto& this_ = reinterpret_cast<TransportData*>(transport)->self;
RING_WARN("[email protected]%p: destroy", this_);
delete this_;
return PJ_SUCCESS;
};
/* Init rdata */
rxPool_.reset(pjsip_endpt_create_pool(base.endpt,
"SipIceTransport.rtd%p",
PJSIP_POOL_RDATA_LEN,
PJSIP_POOL_RDATA_INC));
if (not rxPool_)
throw std::bad_alloc();
auto rx_pool = rxPool_.get();
rdata_.tp_info.pool = rx_pool;
rdata_.tp_info.transport = &base;
rdata_.tp_info.tp_data = this;
rdata_.tp_info.op_key.rdata = &rdata_;
pj_ioqueue_op_key_init(&rdata_.tp_info.op_key.op_key, sizeof(pj_ioqueue_op_key_t));
rdata_.pkt_info.src_addr = base.key.rem_addr;
rdata_.pkt_info.src_addr_len = sizeof(rdata_.pkt_info.src_addr);
auto rem_addr = &base.key.rem_addr;
pj_sockaddr_print(rem_addr, rdata_.pkt_info.src_name, sizeof(rdata_.pkt_info.src_name), 0);
rdata_.pkt_info.src_port = pj_sockaddr_get_port(rem_addr);
rdata_.pkt_info.len = 0;
rdata_.pkt_info.zero = 0;
if (pjsip_transport_register(base.tpmgr, &base) != PJ_SUCCESS)
throw std::runtime_error("Can't register PJSIP transport.");
is_registered_ = true;
Manager::instance().registerEventHandler((uintptr_t)this,
[this]{ loop(); });
}
开发者ID:alexzah, 项目名称:ring-daemon, 代码行数:101, 代码来源:sip_transport_ice.cpp
示例11: PJ_DEF
//.........这里部分代码省略.........
status = pj_ssl_sock_set_certificate(listener->ssock, pool,
listener->cert);
if (status != PJ_SUCCESS)
goto on_error;
}
/* Start accepting incoming connections. Note that some TLS/SSL backends
* may not support for SSL socket server.
*/
has_listener = PJ_FALSE;
status = pj_ssl_sock_start_accept(listener->ssock, pool,
(pj_sockaddr_t*)listener_addr,
pj_sockaddr_get_len((pj_sockaddr_t*)listener_addr));
if (status == PJ_SUCCESS || status == PJ_EPENDING) {
pj_ssl_sock_info info;
has_listener = PJ_TRUE;
/* Retrieve the bound address */
status = pj_ssl_sock_get_info(listener->ssock, &info);
if (status == PJ_SUCCESS)
pj_sockaddr_cp(listener_addr, (pj_sockaddr_t*)&info.local_addr);
} else if (status != PJ_ENOTSUP) {
goto on_error;
}
/* If published host/IP is specified, then use that address as the
* listener advertised address.
*/
if (a_name && a_name->host.slen) {
/* Copy the address */
listener->factory.addr_name = *a_name;
pj_strdup(listener->factory.pool, &listener->factory.addr_name.host,
&a_name->host);
listener->factory.addr_name.port = a_name->port;
} else {
/* No published address is given, use the bound address */
/* If the address returns 0.0.0.0, use the default
* interface address as the transport's address.
*/
if (!pj_sockaddr_has_addr(listener_addr)) {
pj_sockaddr hostip;
status = pj_gethostip(af, &hostip);
if (status != PJ_SUCCESS)
goto on_error;
pj_sockaddr_copy_addr(listener_addr, &hostip);
}
/* Save the address name */
sockaddr_to_host_port(listener->factory.pool,
&listener->factory.addr_name, listener_addr);
}
/* If port is zero, get the bound port */
if (listener->factory.addr_name.port == 0) {
listener->factory.addr_name.port = pj_sockaddr_get_port(listener_addr);
}
pj_ansi_snprintf(listener->factory.obj_name,
sizeof(listener->factory.obj_name),
"tlslis:%d", listener->factory.addr_name.port);
/* Register to transport manager */
listener->endpt = endpt;
listener->tpmgr = pjsip_endpt_get_tpmgr(endpt);
listener->factory.create_transport2 = lis_create_transport;
listener->factory.destroy = lis_destroy;
listener->is_registered = PJ_TRUE;
status = pjsip_tpmgr_register_tpfactory(listener->tpmgr,
&listener->factory);
if (status != PJ_SUCCESS) {
listener->is_registered = PJ_FALSE;
goto on_error;
}
if (has_listener) {
PJ_LOG(4,(listener->factory.obj_name,
"SIP TLS listener is ready for incoming connections "
"at %.*s:%d",
(int)listener->factory.addr_name.host.slen,
listener->factory.addr_name.host.ptr,
listener->factory.addr_name.port));
} else {
PJ_LOG(4,(listener->factory.obj_name, "SIP TLS is ready "
"(client only)"));
}
/* Return the pointer to user */
if (p_factory) *p_factory = &listener->factory;
return PJ_SUCCESS;
on_error:
lis_destroy(&listener->factory);
return status;
}
开发者ID:Archipov, 项目名称:android-client, 代码行数:101, 代码来源:sip_transport_tls.c
示例12: tls_create
/*
* Common function to create TLS transport, called when pending accept() and
* pending connect() complete.
*/
static pj_status_t tls_create( struct tls_listener *listener,
pj_pool_t *pool,
pj_ssl_sock_t *ssock,
pj_bool_t is_server,
const pj_sockaddr *local,
const pj_sockaddr *remote,
const pj_str_t *remote_name,
struct tls_transport **p_tls)
{
struct tls_transport *tls;
const pj_str_t ka_pkt = PJSIP_TLS_KEEP_ALIVE_DATA;
char print_addr[PJ_INET6_ADDRSTRLEN+10];
pj_status_t status;
PJ_ASSERT_RETURN(listener && ssock && local && remote && p_tls, PJ_EINVAL);
if (pool == NULL) {
pool = pjsip_endpt_create_pool(listener->endpt, "tls",
POOL_TP_INIT, POOL_TP_INC);
PJ_ASSERT_RETURN(pool != NULL, PJ_ENOMEM);
}
/*
* Create and initialize basic transport structure.
*/
tls = PJ_POOL_ZALLOC_T(pool, struct tls_transport);
tls->is_server = is_server;
tls->verify_server = listener->tls_setting.verify_server;
pj_list_init(&tls->delayed_list);
tls->base.pool = pool;
pj_ansi_snprintf(tls->base.obj_name, PJ_MAX_OBJ_NAME,
(is_server ? "tlss%p" :"tlsc%p"), tls);
status = pj_atomic_create(pool, 0, &tls->base.ref_cnt);
if (status != PJ_SUCCESS) {
goto on_error;
}
status = pj_lock_create_recursive_mutex(pool, "tls", &tls->base.lock);
if (status != PJ_SUCCESS) {
goto on_error;
}
if (remote_name)
pj_strdup(pool, &tls->remote_name, remote_name);
tls->base.key.type = listener->factory.type;
pj_sockaddr_cp(&tls->base.key.rem_addr, remote);
tls->base.type_name = (char*)pjsip_transport_get_type_name(
(pjsip_transport_type_e)tls->base.key.type);
tls->base.flag = pjsip_transport_get_flag_from_type(
(pjsip_transport_type_e)tls->base.key.type);
tls->base.info = (char*) pj_pool_alloc(pool, 64);
pj_ansi_snprintf(tls->base.info, 64, "%s to %s",
tls->base.type_name,
pj_sockaddr_print(remote, print_addr,
sizeof(print_addr), 3));
tls->base.addr_len = pj_sockaddr_get_len(remote);
tls->base.dir = is_server? PJSIP_TP_DIR_INCOMING : PJSIP_TP_DIR_OUTGOING;
/* Set initial local address */
if (!pj_sockaddr_has_addr(local)) {
pj_sockaddr_cp(&tls->base.local_addr,
&listener->factory.local_addr);
} else {
pj_sockaddr_cp(&tls->base.local_addr, local);
}
sockaddr_to_host_port(pool, &tls->base.local_name, &tls->base.local_addr);
if (tls->remote_name.slen) {
tls->base.remote_name.host = tls->remote_name;
tls->base.remote_name.port = pj_sockaddr_get_port(remote);
} else {
sockaddr_to_host_port(pool, &tls->base.remote_name, remote);
}
tls->base.endpt = listener->endpt;
tls->base.tpmgr = listener->tpmgr;
tls->base.send_msg = &tls_send_msg;
tls->base.do_shutdown = &tls_shutdown;
tls->base.destroy = &tls_destroy_transport;
tls->ssock = ssock;
/* Register transport to transport manager */
status = pjsip_transport_register(listener->tpmgr, &tls->base);
if (status != PJ_SUCCESS) {
goto on_error;
}
//.........这里部分代码省略.........
开发者ID:Archipov, 项目名称:android-client, 代码行数:101, 代码来源:sip_transport_tls.c
示例13: udp_on_read_complete
/*
* udp_on_read_complete()
*
* This is callback notification from ioqueue that a pending recvfrom()
* operation has completed.
*/
static void udp_on_read_complete( pj_ioqueue_key_t *key,
pj_ioqueue_op_key_t *op_key,
pj_ssize_t bytes_read)
{
/* See https://trac.pjsip.org/repos/ticket/1197 */
enum { MAX_IMMEDIATE_PACKET = 50 };
pjsip_rx_data_op_key *rdata_op_key = (pjsip_rx_data_op_key*) op_key;
pjsip_rx_data *rdata = rdata_op_key->rdata;
struct udp_transport *tp = (struct udp_transport*)rdata->tp_info.transport;
int i;
pj_status_t status;
++tp->read_loop_spin;
/* Don't do anything if transport is closing. */
if (tp->is_closing) {
tp->is_closing++;
goto on_return;
}
/* Don't do anything if transport is being paused. */
if (tp->is_paused)
goto on_return;
#if defined(PJ_IPHONE_OS_HAS_MULTITASKING_SUPPORT) && \
PJ_IPHONE_OS_HAS_MULTITASKING_SUPPORT!=0
if (-bytes_read == PJ_ESOCKETSTOP) {
--tp->read_loop_spin;
/* Try to recover by restarting the transport. */
PJ_LOG(4,(tp->base.obj_name, "Restarting SIP UDP transport"));
status = pjsip_udp_transport_restart2(
&tp->base,
PJSIP_UDP_TRANSPORT_DESTROY_SOCKET,
PJ_INVALID_SOCKET,
&tp->base.local_addr,
&tp->base.local_name);
if (status != PJ_SUCCESS) {
PJ_PERROR(1,(THIS_FILE, status,
"Error restarting SIP UDP transport"));
}
return;
}
#endif
/*
* The idea of the loop is to process immediate data received by
* pj_ioqueue_recvfrom(), as long as i < MAX_IMMEDIATE_PACKET. When
* i is >= MAX_IMMEDIATE_PACKET, we force the recvfrom() operation to
* complete asynchronously, to allow other sockets to get their data.
*/
for (i=0;; ++i) {
enum { MIN_SIZE = 32 };
pj_uint32_t flags;
/* Report the packet to transport manager. Only do so if packet size
* is relatively big enough for a SIP packet.
*/
if (bytes_read > MIN_SIZE) {
pj_ssize_t size_eaten;
const pj_sockaddr *src_addr = &rdata->pkt_info.src_addr;
/* Init pkt_info part. */
rdata->pkt_info.len = bytes_read;
rdata->pkt_info.zero = 0;
pj_gettimeofday(&rdata->pkt_info.timestamp);
pj_sockaddr_print(src_addr, rdata->pkt_info.src_name,
sizeof(rdata->pkt_info.src_name), 0);
rdata->pkt_info.src_port = pj_sockaddr_get_port(src_addr);
size_eaten =
pjsip_tpmgr_receive_packet(rdata->tp_info.transport->tpmgr,
rdata);
if (size_eaten < 0) {
pj_assert(!"It shouldn't happen!");
size_eaten = rdata->pkt_info.len;
}
/* Since this is UDP, the whole buffer is the message. */
rdata->pkt_info.len = 0;
} else if (bytes_read <= MIN_SIZE) {
/* TODO: */
} else if (-bytes_read != PJ_STATUS_FROM_OS(OSERR_EWOULDBLOCK) &&
-bytes_read != PJ_STATUS_FROM_OS(OSERR_EINPROGRESS) &&
-bytes_read != PJ_STATUS_FROM_OS(OSERR_ECONNRESET))
{
/* Report error to endpoint. */
PJSIP_ENDPT_LOG_ERROR((rdata->tp_info.transport->endpt,
rdata->tp_info.transport->obj_name,
//.........这里部分代码省略.........
开发者ID:ismangil, 项目名称:pjproject, 代码行数:101, 代码来源:sip_transport_udp.c
示例14: create_ses_by_remote_sdp
static int create_ses_by_remote_sdp(int local_port, char *sdp)
{
pj_media_session_t *ses = NULL;
pjsdp_session_desc *sdp_ses;
pj_media_sock_info skinfo;
pj_pool_t *pool;
char s[4];
const pj_media_stream_info *info[2];
int i, count;
pool = pj_pool_create(pf, "sdp", 1024, 0, NULL);
if (!pool) {
PJ_LOG(1,(THIS_FILE, "Unable to create pool"));
return -1;
}
pj_bzero(&skinfo, sizeof(skinfo));
skinfo.rtp_sock = skinfo.rtcp_sock = pj_sock_socket(pj_AF_INET(), pj_SOCK_DGRAM(), 0, 0);
if (skinfo.rtp_sock == PJ_INVALID_SOCKET) {
PJ_LOG(1,(THIS_FILE, "Unable to create socket"));
goto on_error;
}
pj_sockaddr_init2(&skinfo.rtp_addr_name, "0.0.0.0", local_port);
if (pj_sock_bind(skinfo.rtp_sock, (struct pj_sockaddr*)&skinfo.rtp_addr_name, sizeof(pj_sockaddr_in)) != 0) {
PJ_LOG(1,(THIS_FILE, "Unable to bind socket"));
goto on_error;
}
sdp_ses = pjsdp_parse(sdp, strlen(sdp), pool);
if (!sdp_ses) {
PJ_LOG(1,(THIS_FILE, "Error parsing SDP"));
goto on_error;
}
ses = pj_media_session_create_from_sdp(mm, sdp_ses, &skinfo);
if (!ses) {
PJ_LOG(1,(THIS_FILE, "Unable to create session from SDP"));
goto on_error;
}
if (pj_media_session_activate(ses) != 0) {
PJ_LOG(1,(THIS_FILE, "Error activating session"));
goto on_error;
}
count = pj_media_session_enum_streams(ses, 2, info);
printf("\nDumping streams: \n");
for (i=0; i<count; ++i) {
const char *dir;
char *local_ip;
switch (info[i]->dir) {
case PJMEDIA_DIR_NONE:
dir = "- NONE -"; break;
case PJMEDIA_DIR_ENCODING:
dir = "SENDONLY"; break;
case PJMEDIA_DIR_DECODING:
dir = "RECVONLY"; break;
case PJMEDIA_DIR_ENCODING_DECODING:
dir = "SENDRECV"; break;
default:
dir = "?UNKNOWN"; break;
}
local_ip = pj_sockaddr_get_str_addr(&info[i]->sock_info.rtp_addr_name);
printf(" Stream %d: %.*s %s local=%s:%d remote=%.*s:%d\n",
i, info[i]->type.slen, info[i]->type.ptr,
dir,
local_ip, pj_sockaddr_get_port(&info[i]->sock_info.rtp_addr_name),
info[i]->rem_addr.slen, info[i]->rem_addr.ptr, info[i]->rem_port);
}
puts("Press <ENTER> to quit");
fgets(s, sizeof(s), stdin);
pj_media_session_destroy(ses);
pj_sock_close(skinfo.rtp_sock);
pj_pool_release(pool);
return 0;
on_error:
if (ses)
pj_media_session_destroy(ses);
if (skinfo.rtp_sock != PJ_INVALID_SOCKET)
pj_sock_close(skinfo.rtp_sock);
if (pool)
pj_pool_release(pool);
return -1;
}
开发者ID:carlosdelfino, 项目名称:WorkshopTelefoniaAutomacao, 代码行数:92, 代码来源:audio_tool.c
示例15: extract_sdp_to_xml
static int extract_sdp_to_xml(struct ice_trans_s* icetrans,char buffer[], unsigned maxlen, ice_option_t opt, char *usrid)
{
char *p = buffer;
unsigned comp;
int printed;
pj_str_t local_ufrag, local_pwd;
pj_status_t status;
//Me: add
PRINT(" <registerPeer>");
PRINT("<device> <uniqueId>%s</uniqueId> </device>", usrid);
/* Write "dummy" SDP v=, o=, s=, and t= lines */
// Me: comment
//PRINT("v=0\no=- 3414953978 3414953978 IN IP4 localhost\ns=ice\nt=0 0\n");
/* Get ufrag and pwd from current session */
pj_ice_strans_get_ufrag_pwd(icetrans->icest, &local_ufrag, &local_pwd,
NULL, NULL);
/* Write the a=ice-ufrag and a=ice-pwd attributes */
// Me: comment
//PRINT("a=ice-ufrag:%.*s\na=ice-pwd:%.*s\n",
// (int)local_ufrag.slen,
// local_ufrag.ptr,
// (int)local_pwd.slen,
// local_pwd.ptr);
PRINT("<ufrag>%.*s</ufrag> <pwd>%.*s</pwd>",
(int)local_ufrag.slen,
local_ufrag.ptr,
(int)local_pwd.slen,
local_pwd.ptr);
PRINT(" <candidateList>");
/* Write each component */
for (comp=0; comp<opt.comp_cnt; ++comp) {
unsigned j, cand_cnt;
pj_ice_sess_cand cand[PJ_ICE_ST_MAX_CAND];
char ipaddr[PJ_INET6_ADDRSTRLEN];
/* Get default candidate for the component */
status = pj_ice_strans_get_def_cand(icetrans->icest, comp+1, &cand[0]);
if (status != PJ_SUCCESS)
return -status;
/* Write the default address */
if (comp==0) {
/* For component 1, default address is in m= and c= lines */
// Me: comment
// PRINT("m=audio %d RTP/AVP 0\n"
// "c=IN IP4 %s\n",
// (int)pj_sockaddr_get_port(&cand[0].addr),
// pj_sockaddr_print(&cand[0].addr, ipaddr,
// sizeof(ipaddr), 0));
PRINT("<comp_1> <port>%d</port>"
"<ip>%s</ip> </comp_1>",
(int)pj_sockaddr_get_port(&cand[0].addr),
pj_sockaddr_print(&cand[0].addr, ipaddr,
sizeof(ipaddr), 0));
} else if (comp==1) {
/* For component 2, default address is in a=rtcp line */
//Me: comment
//PRINT("a=rtcp:%d IN IP4 %s\n",
// (int)pj_sockaddr_get_port(&cand[0].addr),
// pj_sockaddr_print(&cand[0].addr, ipaddr,
// sizeof(ipaddr), 0));
} else {
/* For other components, we'll just invent this.. */
// Me: comment
//PRINT("a=Xice-defcand:%d IN IP4 %s\n",
// (int)pj_sockaddr_get_port(&cand[0].addr),
// pj_sockaddr_print(&cand[0].addr, ipaddr,
// sizeof(ipaddr), 0));
}
/* Enumerate all candidates for this component */
cand_cnt = PJ_ARRAY_SIZE(cand);
status = pj_ice_strans_enum_cands(icetrans->icest, comp+1,
&cand_cnt, cand);
if (status != PJ_SUCCESS)
return -status;
/* And encode the candidates as SDP */
//const int buffer_xml_len = 2048;
//char buffer_xml[buffer_xml_len];
for (j=0; j<cand_cnt; ++j) {
printed = print_cand_to_xml(p, maxlen - (unsigned)(p-buffer), &cand[j]);
if (printed < 0)
return -PJ_ETOOSMALL;
// printed = print_cand_to_xml(p, maxlen - (unsigned)(p-buffer), &cand[j]);
// if (printed < 0)
//.........这里部分代码省略.........
开发者ID:johnverik, 项目名称:00_prj_ra, 代码行数:101, 代码来源:icewrapper.c
六六分期app的软件客服如何联系?不知道吗?加qq群【895510560】即可!标题:六六分期
阅读:19215| 2023-10-27
今天小编告诉大家如何处理win10系统火狐flash插件总是崩溃的问题,可能很多用户都不知
阅读:9995| 2022-11-06
今天小编告诉大家如何对win10系统删除桌面回收站图标进行设置,可能很多用户都不知道
阅读:8331| 2022-11-06
今天小编告诉大家如何对win10系统电脑设置节能降温的设置方法,想必大家都遇到过需要
阅读:8699| 2022-11-06
我们在使用xp系统的过程中,经常需要对xp系统无线网络安装向导设置进行设置,可能很多
阅读:8643| 2022-11-06
今天小编告诉大家如何处理win7系统玩cf老是与主机连接不稳定的问题,可能很多用户都不
阅读:9664| 2022-11-06
电脑对日常生活的重要性小编就不多说了,可是一旦碰到win7系统设置cf烟雾头的问题,很
阅读:8627| 2022-11-06
我们在日常使用电脑的时候,有的小伙伴们可能在打开应用的时候会遇见提示应用程序无法
阅读:8003| 2022-11-06
今天小编告诉大家如何对win7系统打开vcf文件进行设置,可能很多用户都不知道怎么对win
阅读:8661| 2022-11-06
今天小编告诉大家如何对win10系统s4开启USB调试模式进行设置,可能很多用户都不知道怎
阅读:7537| 2022-11-06
请发表评论