예제 #1
0
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;
}
예제 #2
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 */
예제 #3
0
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 */
예제 #4
0
파일: error.c 프로젝트: fucan/cplusplus
/*
 * 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 */
예제 #5
0
/*
 * 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);
}
예제 #6
0
파일: error.c 프로젝트: fucan/cplusplus
/*
 * 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 */
예제 #7
0
파일: error.c 프로젝트: fucan/cplusplus
/*
 * 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 */
예제 #8
0
파일: main.old.c 프로젝트: sbenning42/42
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);
}
예제 #9
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);
}
예제 #10
0
/* 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);
        }
}
예제 #11
0
/*
 * [ 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;
}
예제 #12
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;
}
예제 #13
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);
	}
}
예제 #14
0
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;
}
예제 #15
0
파일: adapt_bw.c 프로젝트: cftyngit/nctuns
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;
}
예제 #16
0
파일: adapt_bw.c 프로젝트: cftyngit/nctuns
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;
}