int initial_session(int argc, char **argv, session_id sid){ for (i = 0; i < 10; i ++) { src[i] = 0; } err = rtp_add_sour_list(sid, local_ip, local_port, proto, proto); /* set receive addr */ if (err) { err_handle(err); } err = rtp_set_sdes_item(sid, RTCP_SDES_CNAME, cname, 1); /* for CNAME SDES */ if (err) { err_handle(err); } /* add the RTP Session's host address to send to and setup the socket. (NOTE : port != 0)*/ err = rtp_open_connection(sid); if (err) { err_handle(err); } return 0; }
void t_err_sys(int thread_err_code, const char *cause, ...) { va_list ap; va_start(ap, cause); err_handle(2, thread_err_code, cause, ap); va_end(ap); exit(EXIT_FAILURE); } /* end t_err_sys */
void err_msg(const char *cause, ...) { va_list ap; va_start(ap, cause); err_handle(0, 0, cause, ap); va_end(ap); return; } /* end err_msg */
/* * win_err_sys —— 输出win-sdk的错误信息(包括系统的错误信息) */ void win_err_sys(const char *cause, ...) { va_list ap; va_start(ap, cause); err_handle(3, cause, ap); va_end(ap); return; } /* end win_err_sys */
/* * err_msg -- print normal err msg, then quit */ void err_msg_q(const char *cause, ...) { va_list ap; va_start(ap, cause); err_handle(0, cause, ap); va_end(ap); exit(EXIT_FAILURE); }
/* * std_err_sys_q —— 输出错误信息(包括系统的错误信息),并退出 */ void std_err_sys_q(const char *cause, ...) { va_list ap; va_start(ap, cause); err_handle(1, cause, ap); va_end(ap); exit(EXIT_FAILURE); } /* end std_err_sys_q */
/* * sock_err_sys_q —— 输出winsock的错误信息(包括系统的错误信息),并退出 */ void sock_err_sys_q(const char *cause, ...) { va_list ap; va_start(ap, cause); err_handle(2, cause, ap); va_end(ap); WSACleanup(); exit(EXIT_FAILURE); } /* end sock_err_sys_q */
int main(int ac, char **av) { t_dtab token; if (ac < 2) return (err_handle(ERR_ARG, &token)); else if (!dtab_init(&token, OFFSET, sizeof(t_tok))) return (err_handle(ERR_ML, &token)); while (--ac) { av++; if ((err_handle(lex_lexer(&token, *(av)), &token)) < ERR ) continue ; if ((err_handle(par_parser(&token), &token)) < ERR) continue ; put_reduce(&token); //err_handle(res_resolve(&polynome, *av), &token); // deb_put((t_tok *)token.data, token.size); } dtab_del(&token); return (0); }
/* set local receive addr, CNAME, and startup the connectoin */ void initial_session(int argc, char **argv, session_id sid){ /* setting commad line information */ local_ip = argv[1]; local_port = atoi(argv[2]); cname = argv[3]; /* set local receive addr */ err = rtp_add_sour_list(sid, local_ip, local_port, proto, proto); if (err) err_handle(err); /* set CNAME. (see RFC 3550) */ err = rtp_set_sdes_item(sid, RTCP_SDES_CNAME, cname, 1); /* for CNAME SDES */ if (err) err_handle(err); /* add the RTP Session's host address to send to and setup the socket. (NOTE : port != 0)*/ err = rtp_open_connection(sid); if (err) err_handle(err); }
/* SDP : Session Description Protocol, RFC 2327. * we parse the SDP generated by NCTUns GUI, you can edit the sdp file by yourself and rewrite the sdp_parse() * for parsing the sdp file */ void sdp_parse(session_id sid, char **argv){ FILE *fp; char line[50], *token; fp = fopen(argv[4], "r"); if (fp) { while (fgets(line, 50, fp) != NULL) { token = strtok(line, "\t\n "); if (!strncmp(token, "e=", 2)) { /* email address */ char *tmp; tmp = token + 2; token = strtok(NULL, "\t\n "); err = rtp_set_sdes_item(sid, RTCP_SDES_EMAIL, tmp, atoi(token)); if (err) err_handle(err); printf("set email=%s with interval %d for sending SDES RTCP packet.\n", tmp, atoi(token)); } else if (!strncmp(token, "p=", 2)) { /* phone number */ char *tmp; tmp = token + 2; token = strtok(NULL, "\t\n "); err = rtp_set_sdes_item(sid, RTCP_SDES_PHONE, tmp, atoi(token)); if (err) err_handle(err); printf("set phone=%s with interval %d for sending SDES RTCP packet.\n", tmp, atoi(token)); } else if (!strncmp(token, "b=AS:", 5)) { char *tmp; tmp = token + 5; session_bw = atof(tmp); err = rtp_set_session_bw(sid, session_bw); /* set session bandwidth for this application */ if (err) err_handle(err); printf("set session bandwidth=%lf\n", session_bw); } else if (!strncmp(token, "t=", 2)) { /* time the session is active, NOTE! max_time is 4200 in NCTUns. */ char *tmp; tmp = token + 2; rtp_start_time = atof(tmp); /* the rtp session start time */ token = strtok(NULL, "\t\n "); rtp_stop_time = atof(token); /* the rtp session stop time */ printf("rtp_start_time = %lf, rtp_stop_time = %lf\n", rtp_start_time, rtp_stop_time); } else if (!strcmp(token, "m=audio")) { /* media type is audio */ is_audio = 1; token = strtok(NULL, "\t\n "); remote_port = atoi(token); token = strtok(NULL, "\t\n "); token = strtok(NULL, "\t\n "); codec_num = atoi(token); } else if (!strcmp(token, "m=video")) { /* media type is video */ is_audio = 0; token = strtok(NULL, "\t\n "); remote_port = atoi(token); } else if (!strncmp(token, "a=rtpmap:", 9)) { /* rtpmap */ char *tmp, *temp, *rate; tmp = token + 9; codec_num = atoi(tmp); token = strtok(NULL, "\t\n "); tmp = strchr(token, '/'); codec_name = strndup(token, (tmp - token)); temp = strchr((tmp + 1), '/'); rate = strndup((tmp + 1), (temp - (tmp + 1))); sampling_rate = atof(rate); free(rate); bits_per_sample = atof(temp + 1); printf("codec_num = %d, codec_name = %s, sampling_rate = %lf, bits_per_sample = %lf\n", codec_num, codec_name, sampling_rate, bits_per_sample); } else if (!strncmp(token, "a=ptime:", 8)) { /* ptime */ char *tmp; tmp = token + 8; ms_pkt = atof(tmp); printf("ptime = %lf (ms)\n", ms_pkt); } else if (!strncmp(token, "a=framerate:", 12)) { /* framerate */ char *tmp; tmp = token + 12; framerate = atof(tmp); printf("frames/sec = %lf\n", framerate); } else if (!strcmp(token, "c=IN")) { /* IN: internet */ char *tmp; tmp = token + 4; token = strtok(NULL, "\t\n "); if (!strcmp(token, "IP4")) { token = strtok(NULL, "\t\n "); /* add the destination address(es) */ err = rtp_add_dest_list(sid, token, remote_port, ttl, proto, proto); if (err) err_handle(err); printf("add the sending address %s\n", token); } } else { // unknown type, ignore it. } } } else { fprintf(stderr, "Can't open file - %s , process terminated\n", argv[4]); exit(1); } }
/* * [ application_name local_ip local_port cname sdp_file [-t trace_file] ] */ int main(int argc, char **argv){ /* create a rtp session, we will assign unique value to identify */ err = rtp_create(&sid); if (err) { err_handle(err); } sdp_parse(sid, argv); /* parse the sdp file */ /* The application will sleep "rtp_start_time" time if "rtp_start_time" > 0 when the application is start. * * NOTE! This is not the same with Start Time in NCTUns * EX: if the Start Time in NCTUn is 5, and rtp_start_time is 3, * then the real time to startup the applicaion is 8. */ if (rtp_start_time > 0) usleep( ((int) rtp_start_time * 1000000) ); initial_session(argc, argv, sid); /* set local receive addr, CNAME, and startup the connectoin */ if (is_audio) /* media type is audio */ delay = (ms_pkt / 1000.); else delay = (1. / framerate); err = rtp_get_sour_rtpsocket(sid, &rtp_sockt); /* get source rtp socket */ if (err) err_handle(err); err = rtp_get_sour_rtcpsocket(sid, &rtcp_sockt); /* get source rtcp socket */ if (err) err_handle(err); if (rtp_sockt > nfds || rtcp_sockt > nfds) { if (rtp_sockt > rtcp_sockt) nfds = rtp_sockt; else nfds = rtcp_sockt; } FD_ZERO(&afds); FD_ZERO(&rfds); FD_SET(rtp_sockt, &afds); FD_SET(rtcp_sockt, &afds); gettimeofday(&start_tv, NULL); starttime = (start_tv.tv_sec + start_tv.tv_usec / 1000000.); now = starttime; rtp_interval = rtp_stop_time - rtp_start_time; /* bytes of each packet = ((bits/sample) / 8 ) * (clock rate) * ( each delay of packet in sec ) */ // packet_size = (int) ( (bits_per_sample / 8.) * sampling_rate * delay); while ((now - starttime) <= rtp_interval) { memcpy(&rfds, &afds, sizeof(rfds)); err = get_rtcp_timeout(sid, &timeout_tv); /* get the send_rtcp_packet time */ if (err) err_handle(err); if (time_expire(&timeout_tv, &now_tv)) { err = rtp_check_on_expire(); /* rtcp on_expire */ if (err) err_handle(err); err = get_rtcp_timeout(sid, &timeout_tv); /* get the send_rtcp_packet time */ if (err) err_handle(err); } nexttime_tv = double_to_timeval(timeval_to_double(timeout_tv) - now); if (select(nfds + 1, &rfds, (fd_set *)0, (fd_set *)0, &nexttime_tv) < 0) { if (errno == EINTR) continue; else { printf("nexttime_tv.tv_sec = %ld\n", nexttime_tv.tv_sec); printf("nexttime_tv.tv_usec = %ld\n", nexttime_tv.tv_usec); printf("select error: %d\n", errno); } } if (FD_ISSET(rtp_sockt, &rfds)) { err = on_receive(sid, rtp_sockt, recvbuf, &recbuflen); if (err) err_handle(err); } else if (FD_ISSET(rtcp_sockt, &rfds)) { err = on_receive(sid, rtcp_sockt, recvbuf, &recbuflen); if (err) err_handle(err); } gettimeofday(&now_tv, NULL); now = (now_tv.tv_sec + now_tv.tv_usec / 1000000.); } // while ((now - starttime) <= rtp_interval) err = rtp_close_connection(sid, reason); if (err) { err_handle(err); } err = rtp_delete(sid); if (err) { err_handle(err); } return 0; }
int main(int argc, char **argv){ /* setting commad line information */ local_ip = argv[1]; local_port = atoi(argv[2]); cname = argv[3]; proto = udp; /* create a rtp session, we will assign unique value to identify */ err = rtp_create(&sid); if (err) { err_handle(err); } sdp_parse(sid, argv); if (rtp_start_time > 0) { usleep( ((int) rtp_start_time * 1000000) ); } if ((i = initial_session(argc, argv, sid))) { printf("WARNING : initial_session warning = %d\n", i); } else { printf("initial_session is ok\n"); } if (is_audio) { delay = (ms_pkt / 1000.); } else { delay = (1. / framerate); // unit: ms/sec. we assume that 300 samples/frame, } /* bytes of each packet = ((bits/sample) / 8 ) * (clock rate) * ( each delay of packet in sec ) */ packet_size = (int) ( bits_per_sample * sampling_rate * delay / 8.); /* original_bw = min_bw = 50, so we use the same pkt size */ minbw_pktsize = packet_size; printf("bits_per_sample = %lf, (bits_per_sample/8.) = %lf\n", bits_per_sample, (bits_per_sample/8.)); printf("sampling_rate = %lf\n", sampling_rate); printf("delay = %lf\n", delay); printf("packet_size = %d\n", packet_size); fflush(stdout); /* the bandwidth wa are using, 30 = frames/sec */ cur_bw = get_cur_bw(packet_size); err = rtp_get_sour_rtpsocket(sid, &rtp_sockt); if (err) { err_handle(err); } err = rtp_get_sour_rtcpsocket(sid, &rtcp_sockt); if (err) { err_handle(err); } if (rtp_sockt > nfds || rtcp_sockt > nfds) { if (rtp_sockt > rtcp_sockt) nfds = rtp_sockt; else nfds = rtcp_sockt; } FD_ZERO(&afds); FD_ZERO(&rfds); FD_SET(rtp_sockt, &afds); FD_SET(rtcp_sockt, &afds); gettimeofday(&start_tv, NULL); starttime = (start_tv.tv_sec + start_tv.tv_usec / 1000000.); nexttime = starttime; rtp_interval = rtp_stop_time - rtp_start_time; printf("rtp_interval = %f\n", rtp_interval); fflush(stdout); while (rtp_interval >= 0) { memcpy(&rfds, &afds, sizeof(rfds)); if (RTP_MAX_PKT_SIZE < packet_size){ fprintf(stderr, "RTP_MAX_PKT_SIZE < reads\n"); continue; } addtimestamp = ((int) packet_size * (bits_per_sample / 8.) ); err = rtp_send(sid, marker, addtimestamp, codec_num, (int8 *)sendbuf, packet_size); if (err) { err_handle(err); } marker = 0; /* not the first packet of talkspurt */ rtp_interval -= delay; nexttime += delay; gettimeofday(&now_tv, NULL); now = (now_tv.tv_sec + now_tv.tv_usec / 1000000.); err = get_rtcp_timeout(sid, &timeout_tv); if (err) { err_handle(err); } while (now < nexttime) { /* send next packet until now >= nexttime */ //printf("now = %lf\n", now); //printf("nexttime = %lf\n", nexttime); if (time_expire(&timeout_tv, &now_tv)) { err = rtp_check_on_expire(); if (err) { err_handle(err); } err = get_rtcp_timeout(sid, &timeout_tv); if (err) { err_handle(err); } printf("timeval_to_double(timeout_tv) = %lf\n", timeval_to_double(timeout_tv)); } /* BECAREFUL, if we disable RTCP, the timeval we get will be 0 */ if (timeval_to_double(timeout_tv) == 0 || nexttime < timeval_to_double(timeout_tv)) { nexttime_tv = double_to_timeval(nexttime - now); } else { nexttime_tv = double_to_timeval(timeval_to_double(timeout_tv) - now); } if (select(nfds + 1, &rfds, (fd_set *)0, (fd_set *)0, &nexttime_tv) < 0) { if (errno == EINTR) continue; else { printf("nexttime_tv.tv_sec = %ld\n", nexttime_tv.tv_sec); printf("nexttime_tv.tv_usec = %ld\n", nexttime_tv.tv_usec); printf("select error: %d\n", errno); //exit(1); } } if (FD_ISSET(rtp_sockt, &rfds)) { err = on_receive(sid, rtp_sockt, recvbuf, &recbuflen); if (err) { err_handle(err); } } else if (FD_ISSET(rtcp_sockt, &rfds)) { err = on_receive(sid, rtcp_sockt, recvbuf, &recbuflen); if (err) { err_handle(err); } adapt_bw(get_recent_recv_loosrate(sid, &ssrc)); } gettimeofday(&now_tv, NULL); now = (now_tv.tv_sec + now_tv.tv_usec / 1000000.); } // while(now < nexttime) } // while (interval) err = rtp_close_connection(sid, reason); if (err) { err_handle(err); } err = rtp_delete(sid); if (err) { err_handle(err); } return 0; }
void sdp_parse(session_id sid, char **argv){ FILE *fp; char line[50], *token; fp = fopen(argv[4], "r"); if (fp) { while (fgets(line, 50, fp) != NULL) { // Reading stops after an EOF or a newline. A "\0" is stored after the last character in the buffer. token = strtok(line, "\t\n "); if (!strncmp(token, "e=", 2)) { // email address char *tmp; tmp = token + 2; token = strtok(NULL, "\t\n "); err = rtp_set_sdes_item(sid, RTCP_SDES_EMAIL, tmp, atoi(token)); if (err) { err_handle(err); } printf("set email=%s with interval %d\n", tmp, atoi(token)); } else if (!strncmp(token, "p=", 2)) { // phone number char *tmp; tmp = token + 2; token = strtok(NULL, "\t\n "); err = rtp_set_sdes_item(sid, RTCP_SDES_PHONE, tmp, atoi(token)); if (err) { err_handle(err); } printf("set phone=%s with interval %d\n", tmp, atoi(token)); } else if (!strncmp(token, "b=AS:", 5)) { char *tmp; tmp = token + 5; session_bw = atof(tmp); err = rtp_set_session_bw(sid, session_bw); /* set session bandwidth for this application */ if (err) { err_handle(err); } printf("set session bandwidth=%lf\n", session_bw); } else if (!strncmp(token, "t=", 2)) { // time the session is active, NOTE! max t = 4200 in NCTUns. char *tmp; tmp = token + 2; rtp_start_time = atof(tmp); token = strtok(NULL, "\t\n "); rtp_stop_time = atof(token); printf("rtp_start_time = %lf, rtp_stop_time = %lf\n", rtp_start_time, rtp_stop_time); } else if (!strncmp(token, "r=", 2)) { // repeat interval, active duration, list of offset from start-time char *tmp; tmp = token + 2; } else if (!strcmp(token, "m=audio")) { // media is_audio = 1; token = strtok(NULL, "\t\n "); remote_port = atoi(token); token = strtok(NULL, "\t\n "); token = strtok(NULL, "\t\n "); codec_num = atoi(token); } else if (!strcmp(token, "m=video")) { // media is_audio = 0; token = strtok(NULL, "\t\n "); remote_port = atoi(token); token = strtok(NULL, "\t\n "); token = strtok(NULL, "\t\n "); codec_num = atoi(token); } else if (!strncmp(token, "a=rtpmap:", 9)) { // email address char *tmp, *temp, *rate; tmp = token + 9; codec_num = atoi(tmp); token = strtok(NULL, "\t\n "); tmp = strchr(token, '/'); codec_name = strndup(token, (tmp - token)); temp = strchr((tmp + 1), '/'); rate = strndup((tmp + 1), (temp - (tmp + 1))); sampling_rate = atof(rate); free(rate); bits_per_sample = atof(temp + 1); printf("codec_num = %d, codec_name = %s, sampling_rate = %lf, bits_per_sample = %lf\n", codec_num, codec_name, sampling_rate, bits_per_sample); } else if (!strncmp(token, "a=ptime:", 8)) { // email address char *tmp; tmp = token + 8; ms_pkt = atof(tmp); printf("ms_pkt = %lf\n", ms_pkt); } else if (!strncmp(token, "a=framerate:", 12)) { // email address char *tmp; tmp = token + 12; framerate = atof(tmp); printf("frames/sec = %lf\n", framerate); } else if (!strcmp(token, "c=IN")) { // email address char *tmp; tmp = token + 4; token = strtok(NULL, "\t\n "); if (!strcmp(token, "IP4")) { // email address token = strtok(NULL, "\t\n "); if (strncmp(token, local_ip, 15) != 0) { err = rtp_add_dest_list(sid, token, remote_port, ttl, proto, proto); // set send addr if (err) { err_handle(err); } printf("add send address %s\n", token); } } } else { // unknown type, ignore it. } } } else { fprintf(stderr, "Can't open file - %s , process terminated\n", argv[4]); exit(1); } }
int main ( int argc, char* argv[] ) { /* Usage */ if ( argc != 2 ) { fprintf ( stderr, "Usage: %s <Server Name or IPaddress>\n", argv[0] ); return 0; } /* address information */ int listenfd; struct sigaction sa; struct addrinfo servaddr, *rcv; int reuseaddr = 1; // true /* Get the address info */ memset( &servaddr, 0, sizeof( struct addrinfo ) ); servaddr.ai_family = AF_INET; servaddr.ai_socktype = SOCK_STREAM; if ( getaddrinfo( argv[1], PORT, &servaddr, &rcv ) != 0 ) err_handle( "getaddrinfo" ); /* Create the socket */ listenfd = socket( rcv->ai_family, rcv->ai_socktype, rcv->ai_protocol ); if ( listenfd == -1 ) err_handle( "socket" ); /* Enable the socket to reuse the address immediately */ if ( setsockopt( listenfd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof( int ) ) == -1 ) err_handle( "setsockopt" ); /* Bind to the address */ if ( bind( listenfd, rcv->ai_addr, rcv->ai_addrlen ) == -1 ) err_handle( "bind" ); /* Listen */ if ( listen( listenfd, LISTENQ ) == -1 ) err_handle( "listen" ); freeaddrinfo( rcv ); /* Set up the signal handler */ sa.sa_handler = wait_for_child; sigemptyset( &sa.sa_mask ); sa.sa_flags = SA_RESTART; if ( sigaction( SIGCHLD, &sa, NULL) == -1 ) err_handle ( "sigaction" ); /* Main loop */ while (1) { struct sockaddr_in comming_addr; size_t size = sizeof( struct sockaddr_in ); int confd = accept( listenfd, (struct sockaddr*)&comming_addr, &size ); pid_t pid; if ( confd == -1 ) err_handle( "accept" ); printf("Comming connection from %s on port %d \r\n", inet_ntoa(comming_addr.sin_addr), htons(comming_addr.sin_port)); pid = fork(); if ( pid == 0 ) { /* Child process */ close( listenfd ); sock_handle( confd ); close( confd ); return 1; } else { /* Parent process */ if ( pid == -1 ) err_handle( "fork" ); close( confd ); } } close( listenfd ); return 1; }
int main(int argc, char **argv){ /* create a rtp session, we will assign unique value to identify */ err = rtp_create(&sid); if (err) { err_handle(err); } sdp_parse(sid, argv); /* parse the sdp file */ /* The application will sleep "rtp_start_time" time if "rtp_start_time" > 0 when the application is start. * * NOTE! This is not the same with Start Time in NCTUns * EX: if the Start Time in NCTUn is 5, and rtp_start_time is 3, * then the real time to startup the applicaion is 8. */ if (rtp_start_time > 0) { usleep( ((int) rtp_start_time * 1000000) ); } initial_session(argc, argv, sid); /* set local receive addr, CNAME, and startup the connectoin */ if (!trans_mode) { /* throughput is static */ if (is_audio) /* media type is audio */ delay = (ms_pkt / 1000.); else delay = (1. / framerate); /* bytes of each packet = ((bits/sample) / 8 ) * (clock rate) * ( each delay of packet in sec ) */ packet_size = (int) ( (bits_per_sample / 8.) * sampling_rate * delay); if (RTP_MAX_PKT_SIZE < packet_size) { fprintf(stderr, "The packet size is bigger than RTP_MAX_PKT_SIZE\n"); exit(1); } } /* original_bw = min_bw = 50, so we use the same pkt size */ minbw_pktsize = packet_size; printf("bits_per_sample = %lf, (bits_per_sample/8.) = %lf\n", bits_per_sample, (bits_per_sample/8.)); printf("sampling_rate = %lf\n", sampling_rate); printf("delay = %lf\n", delay); printf("packet_size = %d\n", packet_size); /* the bandwidth wa are using, 30 = frames/sec */ cur_bw = get_cur_bw(packet_size); err = rtp_get_sour_rtpsocket(sid, &rtp_sockt); if (err) { err_handle(err); } err = rtp_get_sour_rtcpsocket(sid, &rtcp_sockt); if (err) { err_handle(err); } if (rtp_sockt > nfds || rtcp_sockt > nfds) { if (rtp_sockt > rtcp_sockt) nfds = rtp_sockt; else nfds = rtcp_sockt; } FD_ZERO(&afds); FD_ZERO(&rfds); FD_SET(rtp_sockt, &afds); FD_SET(rtcp_sockt, &afds); gettimeofday(&start_tv, NULL); starttime = (start_tv.tv_sec + start_tv.tv_usec / 1000000.); nexttime = starttime; rtp_interval = rtp_stop_time - rtp_start_time; printf("rtp_interval = %f\n", rtp_interval); fflush(stdout); while (rtp_interval >= 0) { memcpy(&rfds, &afds, sizeof(rfds)); if (RTP_MAX_PKT_SIZE < packet_size){ fprintf(stderr, "RTP_MAX_PKT_SIZE < reads\n"); continue; } addtimestamp = ((int) packet_size * (bits_per_sample / 8.) ); err = rtp_send(sid, marker, addtimestamp, codec_num, (int8 *)sendbuf, packet_size); if (err) { err_handle(err); } marker = 0; /* not the first packet of talkspurt */ rtp_interval -= delay; nexttime += delay; gettimeofday(&now_tv, NULL); now = (now_tv.tv_sec + now_tv.tv_usec / 1000000.); err = get_rtcp_timeout(sid, &timeout_tv); if (err) { err_handle(err); } while (now < nexttime) { /* send next packet until now >= nexttime */ //printf("now = %lf\n", now); //printf("nexttime = %lf\n", nexttime); if (time_expire(&timeout_tv, &now_tv)) { err = rtp_check_on_expire(); if (err) { err_handle(err); } err = get_rtcp_timeout(sid, &timeout_tv); if (err) { err_handle(err); } printf("timeval_to_double(timeout_tv) = %lf\n", timeval_to_double(timeout_tv)); } /* BECAREFUL, if we disable RTCP, the timeval we get will be 0 */ if (timeval_to_double(timeout_tv) == 0 || nexttime < timeval_to_double(timeout_tv)) { nexttime_tv = double_to_timeval(nexttime - now); } else { nexttime_tv = double_to_timeval(timeval_to_double(timeout_tv) - now); } if (select(nfds + 1, &rfds, (fd_set *)0, (fd_set *)0, &nexttime_tv) < 0) { if (errno == EINTR) continue; else { printf("nexttime_tv.tv_sec = %ld\n", nexttime_tv.tv_sec); printf("nexttime_tv.tv_usec = %ld\n", nexttime_tv.tv_usec); printf("select error: %d\n", errno); //exit(1); } } if (FD_ISSET(rtp_sockt, &rfds)) { err = on_receive(sid, rtp_sockt, recvbuf, &recbuflen); if (err) { err_handle(err); } } else if (FD_ISSET(rtcp_sockt, &rfds)) { err = on_receive(sid, rtcp_sockt, recvbuf, &recbuflen); if (err) { err_handle(err); } adapt_bw(get_recent_recv_loosrate(sid, &ssrc)); } gettimeofday(&now_tv, NULL); now = (now_tv.tv_sec + now_tv.tv_usec / 1000000.); } // while(now < nexttime) } // while (interval) err = rtp_close_connection(sid, reason); if (err) { err_handle(err); } err = rtp_delete(sid); if (err) { err_handle(err); } return 0; }
void initial_session(int argc, char **argv, session_id sid) { /* setting commad line information */ local_ip = argv[1]; local_port = atoi(argv[2]); cname = argv[3]; /* set local receive addr */ err = rtp_add_sour_list(sid, local_ip, local_port, proto, proto); if (err) { err_handle(err); } /* set CNAME. (see RFC 3550) */ err = rtp_set_sdes_item(sid, RTCP_SDES_CNAME, cname, 1); if (err) { err_handle(err); } /* add the RTP Session's host address to send to and setup the socket. (NOTE : port != 0)*/ err = rtp_open_connection(sid); if (err) { err_handle(err); } if ( (argc > 5) && !strcmp(argv[5], "-t") ) { FILE *fp; char line[50]; int i = 0; fp = fopen(argv[6], "r"); if (fp) { while (fgets(line, 50, fp) != NULL) { trans_size[i] = atoi(strtok(line, "\t\n ")); if (RTP_MAX_PKT_SIZE < trans_size[i] || trans_size[i] < 0) { fprintf(stderr, "The packet size is illegal.\n"); exit(1); } trans_delay[i] = atoi(strtok(NULL, "\t\n ")); if (trans_delay[i] < 0) { fprintf(stderr, "The delay time is illegal.\n"); exit(1); } i++; } if (!i) { // there is no data in file fprintf(stderr, "There is no data in trace file.\n"); exit(1); } } else { fprintf(stderr, "Can't open file - %s , process terminated\n", argv[6]); exit(1); } trans_size[i] = -1; trans_delay[i] = -1; trans_mode = 1; printf("The application doesn't support trace_file mode.\n"); exit(1); } return; }