int nr_stun_client_ctx_create(char *label, nr_socket *sock, nr_transport_addr *peer, UINT4 RTO, nr_stun_client_ctx **ctxp) { nr_stun_client_ctx *ctx=0; int r,_status; if ((r=nr_stun_startup())) ABORT(r); if(!(ctx=RCALLOC(sizeof(nr_stun_client_ctx)))) ABORT(R_NO_MEMORY); ctx->state=NR_STUN_CLIENT_STATE_INITTED; if(!(ctx->label=r_strdup(label))) ABORT(R_NO_MEMORY); ctx->sock=sock; nr_socket_getaddr(sock,&ctx->my_addr); nr_transport_addr_copy(&ctx->peer_addr,peer); if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_RETRANSMIT_TIMEOUT, &ctx->rto_ms)) { if (RTO != 0) ctx->rto_ms = RTO; else ctx->rto_ms = 100; } if (NR_reg_get_double(NR_STUN_REG_PREF_CLNT_RETRANSMIT_BACKOFF, &ctx->retransmission_backoff_factor)) ctx->retransmission_backoff_factor = 2.0; if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_MAXIMUM_TRANSMITS, &ctx->maximum_transmits)) ctx->maximum_transmits = 7; if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_FINAL_RETRANSMIT_BACKOFF, &ctx->final_retransmit_backoff_ms)) ctx->final_retransmit_backoff_ms = 16 * ctx->rto_ms; *ctxp=ctx; _status=0; abort: if(_status) { nr_stun_client_ctx_destroy(&ctx); } return(_status); }
int main(int argc, char* argv[]) { int verbose = 0; const int maxaddr = 256; nr_transport_addr addresses[maxaddr]; int has_address = 0; StunAddress4 address; int numAddresses = 0; int i; int testNum; int srcPort = 0; printf("STUN client version %s\n",NR_STUN_VERSION); fflush(stdout); nr_crypto_openssl_set(); nr_app_startup("client",NR_APP_STARTUP_INIT_LOGGING|NR_APP_STARTUP_REGISTRY_LOCAL,&NR_LOG_STUN,0,0); NR_reg_set_char("logging.stderr.enabled", 1); NR_reg_set_char("logging.syslog.enabled", 1); NR_reg_set_string("logging.syslog.facility.client.level", "debug"); NR_reg_set_string("logging.syslog.facility.stun.level", "debug"); NR_reg_set_string("logging.stderr.facility.client.level", "debug"); NR_reg_set_string("logging.stderr.facility.stun.level", "debug"); if (nr_stun_startup()) { printf("Failed to start STUN\n"); exit(1); } if (initNetwork()) { printf("Failed to start STUN\n"); exit(1); } StunAddress4 stunServerAddr; stunServerAddr.addr=0; int arg; for ( arg = 1; arg<argc; arg++ ) { if ( !strcmp( argv[arg] , "-v" ) ) { verbose = 1; } else if ( !strcmp( argv[arg] , "-n" ) ) { auth_rule = NR_STUN_AUTH_RULE_OPTIONAL; } else if ( !strcmp( argv[arg] , "-s" ) ) { auth_rule = NR_STUN_AUTH_RULE_SHORT_TERM; } else if ( !strcmp( argv[arg] , "-l" ) ) { auth_rule = NR_STUN_AUTH_RULE_LONG_TERM; } #ifdef USE_STUND_0_96 else if ( !strcmp( argv[arg] , "-c" ) ) { stun_mode = NR_STUN_MODE_STUND_0_96; } #endif /* USE_STUND_0_96 */ else if ( !strcmp( argv[arg] , "-p" ) ) { arg++; if ( argc <= arg ) { usage(); exit(-1); } srcPort = strtol( argv[arg], NULL, 10); } else if ( !strcmp( argv[arg] , "-i" ) ) { arg++; if ( argc <= arg ) { usage(); exit(-1); } if (nr_stun_parse_server_name( argv[arg], &address)) { fprintf(stderr,"%s is not a valid host name \n",argv[arg]); fflush(stderr); usage(); exit(-1); } has_address = 1; } else { char* ptr; int t = strtol( argv[arg], &ptr, 10 ); if ( *ptr == 0 ) { // conversion worked testNum = t; printf("running test number %d\n",testNum); fflush(stdout); } else { if (nr_stun_parse_server_name( argv[arg], &stunServerAddr)) { fprintf(stderr,"%s is not a valid host name \n",argv[arg]); usage(); exit(-1); } } } } if (has_address) { if (nr_ip4_port_to_transport_addr(address.addr, srcPort, IPPROTO_UDP, &addresses[0])) { fprintf(stderr,"bad address\n"); exit(1); } numAddresses=1; } if (numAddresses == 0) { if (nr_stun_find_local_addresses(addresses, maxaddr, &numAddresses)) numAddresses = 0; } else if ( srcPort == 0 ) { if (nr_stun_randomPort(&srcPort)) { fprintf(stderr,"Failed\n"); exit(1); } } if (numAddresses == 0) { address.addr = 0; address.port = srcPort; nr_stun_request(&stunServerAddr,1,&address); } else for (i = 0; i < numAddresses; ++i) { address.addr = ntohl(addresses[i].u.addr4.sin_addr.s_addr); address.port = ntohs(addresses[i].u.addr4.sin_port); nr_stun_request(&stunServerAddr,1,&address); } return 0; }
int nr_stun_client_ctx_create(char *label, nr_socket *sock, nr_transport_addr *peer, UINT4 RTO, nr_stun_client_ctx **ctxp) { nr_stun_client_ctx *ctx=0; char allow_loopback; int r,_status; if ((r=nr_stun_startup())) ABORT(r); if(!(ctx=RCALLOC(sizeof(nr_stun_client_ctx)))) ABORT(R_NO_MEMORY); ctx->state=NR_STUN_CLIENT_STATE_INITTED; if(!(ctx->label=r_strdup(label))) ABORT(R_NO_MEMORY); ctx->sock=sock; nr_socket_getaddr(sock,&ctx->my_addr); nr_transport_addr_copy(&ctx->peer_addr,peer); if (RTO != 0) { ctx->rto_ms = RTO; } else if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_RETRANSMIT_TIMEOUT, &ctx->rto_ms)) { ctx->rto_ms = 100; } if (NR_reg_get_double(NR_STUN_REG_PREF_CLNT_RETRANSMIT_BACKOFF, &ctx->retransmission_backoff_factor)) ctx->retransmission_backoff_factor = 2.0; if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_MAXIMUM_TRANSMITS, &ctx->maximum_transmits)) ctx->maximum_transmits = 7; if (NR_reg_get_uint4(NR_STUN_REG_PREF_CLNT_FINAL_RETRANSMIT_BACKOFF, &ctx->maximum_transmits_timeout_ms)) ctx->maximum_transmits_timeout_ms = 16 * ctx->rto_ms; ctx->mapped_addr_check_mask = NR_STUN_TRANSPORT_ADDR_CHECK_WILDCARD; if (NR_reg_get_char(NR_STUN_REG_PREF_ALLOW_LOOPBACK_ADDRS, &allow_loopback) || !allow_loopback) { ctx->mapped_addr_check_mask |= NR_STUN_TRANSPORT_ADDR_CHECK_LOOPBACK; } if (ctx->my_addr.protocol == IPPROTO_TCP) { /* Because TCP is reliable there is only one final timeout value. * We store the timeout value for TCP in here, because timeout_ms gets * reset to 0 in client_reset() which gets called from client_start() */ ctx->maximum_transmits_timeout_ms = ctx->rto_ms * pow(ctx->retransmission_backoff_factor, ctx->maximum_transmits); ctx->maximum_transmits = 1; } *ctxp=ctx; _status=0; abort: if(_status){ nr_stun_client_ctx_destroy(&ctx); } return(_status); }
int main(int argc, char* argv[]) { StunAddress4 myAddr; int myPort = 0; char verbose=0; char background=0; printf("STUN server version %s\n",NR_STUN_VERSION); fflush(stdout); nr_crypto_openssl_set(); nr_app_startup("server",NR_APP_STARTUP_INIT_LOGGING|NR_APP_STARTUP_REGISTRY_LOCAL,&NR_LOG_STUN,0,0); NR_reg_set_char("logging.stderr.enabled", 1); NR_reg_set_char("logging.syslog.enabled", 1); NR_reg_set_string("logging.syslog.facility.server.level", "debug"); NR_reg_set_string("logging.syslog.facility.stun.level", "debug"); NR_reg_set_string("logging.stderr.facility.client.level", "debug"); NR_reg_set_string("logging.stderr.facility.stun.level", "debug"); if (nr_stun_startup()) { printf("Failed to start STUN\n"); exit(1); } if (initNetwork()) { printf("Failed to start STUN\n"); exit(1); } myAddr.addr = 0; myAddr.port = NR_STUN_PORT; if ( argc <= 2 ) { usage(); exit(-1); } int arg; for ( arg = 1; arg<argc; arg++ ) { if ( !strcmp( argv[arg] , "-v" ) ) { verbose = 1; } else if ( !strcmp( argv[arg] , "-b" ) ) { background = 1; } else if ( !strcmp( argv[arg] , "-a" ) ) { alternate_server = 1; } else if ( !strcmp( argv[arg] , "-h" ) ) { arg++; if ( argc <= arg ) { usage(); exit(-1); } if (nr_stun_parse_server_name(argv[arg], &myAddr)) { usage(); exit(-1); } } else if ( !strcmp( argv[arg] , "-p" ) ) { arg++; if ( argc <= arg ) { usage(); exit(-1); } myPort = (UINT2)(strtol( argv[arg], NULL, 10)); } else { usage(); exit(-1); } } if ( myPort != 0 ) { myAddr.port = myPort; } if ( ( myAddr.addr == 0 ) || ( myAddr.port == 0 ) ) { fprintf(stderr,"Bad command line\n"); fflush(stderr); exit(1); } #if defined(WIN32) int pid=0; if ( background ) { fprintf(stderr,"The -b background option does not work in windows\n"); fflush(stderr); exit(-1); } #else pid_t pid=0; if ( background ) { pid = fork(); if (pid < 0) { fprintf(stderr,"fork: unable to fork\n"); fflush(stderr); exit(-1); } } #endif if (pid == 0) //child or not using background { StunServerInfo info; char ok = 1; if (nr_stun_init_server(&info, &myAddr)) ok = 0; int c=0; while (ok) { if (nr_stun_server_process(&info)) { fprintf(stderr,"Failed\n"); exit(1); } c++; if ( c%10000 == 0 ) { printf("*"); fflush(stdout); } } } return 0; }