int main (int argc, char *argv[]) { int sockfd; int len; int sent; int transport_fd; struct sockaddr_in addr; unsigned long int packet_size; char* tsfile; unsigned char* send_buf; unsigned int bitrate; unsigned long long int packet_time; unsigned long long int real_time; struct timeval time_start; struct timeval time_stop; struct timespec nano_sleep_packet; memset(&addr, 0, sizeof(addr)); memset(&time_start, 0, sizeof(time_start)); memset(&time_stop, 0, sizeof(time_stop)); memset(&nano_sleep_packet, 0, sizeof(nano_sleep_packet)); if(argc < 5 ) { fprintf(stderr, "Usage: %s file.ts ipaddr port bitrate [ts_packet_per_ip_packet]\n", argv[0]); fprintf(stderr, "ts_packet_per_ip_packet default is 7\n"); fprintf(stderr, "bit rate refers to transport stream bit rate\n"); fprintf(stderr, "zero bitrate is 100.000.000 bps\n"); return 0; } else { tsfile = argv[1]; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(argv[2]); addr.sin_port = htons(atoi(argv[3])); bitrate = atoi(argv[4]); if (bitrate <= 0) { bitrate = 100000000; } if (argc >= 6) { packet_size = strtoul(argv[5], 0, 0) * TS_PACKET_SIZE; } else { packet_size = 7 * TS_PACKET_SIZE; } } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd < 0) { perror("socket(): error "); return 0; } transport_fd = open(tsfile, O_RDONLY); if(transport_fd < 0) { fprintf(stderr, "can't open file %s\n", tsfile); close(sockfd); return 0; } int completed = 0; send_buf = malloc(packet_size); packet_time = 0; real_time = 0; gettimeofday(&time_start, 0); while (!completed) { gettimeofday(&time_stop, 0); real_time = usecDiff(&time_stop, &time_start); if (real_time * bitrate > packet_time * 1000000) { /* theorical bits against sent bits */ len = read(transport_fd, send_buf, packet_size); if(len < 0) { fprintf(stderr, "ts file read error \n"); completed = 1; } else if (len == 0) { fprintf(stderr, "ts sent done\n"); completed = 1; } else { sent = sendto(sockfd, send_buf, len, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); if(sent <= 0) { perror("send(): error "); completed = 1; } else { packet_time += packet_size * 8; } } } else { nanosleep(&nano_sleep_packet, 0); } } close(transport_fd); close(sockfd); free(send_buf); return 0; }
int main (int argc, char *argv[]) { int sockfd; int len; int sent; int ret; int is_multicast; int transport_fd; unsigned char option_ttl; char start_addr[4]; struct sockaddr_in addr; unsigned long int packet_size; char* tsfile; unsigned char* send_buf; unsigned int bitrate; unsigned long long int packet_time; unsigned long long int real_time; struct timespec time_start; struct timespec time_stop; struct timespec nano_sleep_packet; memset(&addr, 0, sizeof(addr)); memset(&time_start, 0, sizeof(time_start)); memset(&time_stop, 0, sizeof(time_stop)); memset(&nano_sleep_packet, 0, sizeof(nano_sleep_packet)); if(argc < 5 ) { fprintf(stderr, "Usage: %s file.ts ipaddr port bitrate [ts_packet_per_ip_packet] [udp_packet_ttl]\n", argv[0]); fprintf(stderr, "ts_packet_per_ip_packet default is 7\n"); fprintf(stderr, "bit rate refers to transport stream bit rate\n"); fprintf(stderr, "zero bitrate is 100.000.000 bps\n"); return 0; } else { tsfile = argv[1]; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(argv[2]); addr.sin_port = htons(atoi(argv[3])); bitrate = atoi(argv[4]); if (bitrate <= 0) { bitrate = 100000000; } if (argc >= 6) { packet_size = strtoul(argv[5], 0, 0) * TS_PACKET_SIZE; } else { packet_size = 7 * TS_PACKET_SIZE; } } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if(sockfd < 0) { perror("socket(): error "); return 0; } if (argc >= 7) { option_ttl = atoi(argv[6]); is_multicast = 0; memcpy(start_addr, argv[2], 3); start_addr[3] = 0; is_multicast = atoi(start_addr); is_multicast = (is_multicast >= 224) || (is_multicast <= 239); if (is_multicast) { ret = setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &option_ttl, sizeof(option_ttl)); } else { ret = setsockopt(sockfd, IPPROTO_IP, IP_TTL, &option_ttl, sizeof(option_ttl)); } if(ret < 0) { perror("ttl configuration fail"); } } transport_fd = open(tsfile, O_RDONLY); if(transport_fd < 0) { fprintf(stderr, "can't open file %s\n", tsfile); close(sockfd); return 0; } int completed = 0; send_buf = malloc(packet_size); packet_time = 0; real_time = 0; nano_sleep_packet.tv_nsec = 665778; /* 1 packet at 100mbps*/ int64_t sleep_time = 0; clock_gettime(CLOCK_MONOTONIC, &time_start); while (!completed) { clock_gettime(CLOCK_MONOTONIC, &time_start); //while (real_time * bitrate > packet_time * 1000000 && !completed) int left_len = 5 * bitrate/1000/8/188*188; while(left_len >0) { len = read(transport_fd, send_buf, packet_size); left_len -=len; if(len < 0) { fprintf(stderr, "ts file read error \n"); completed = 1; } else if (len == 0) { fprintf(stderr, "ts sent done\n"); completed = 1; } else { sent = sendto(sockfd, send_buf, len, 0, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); if(sent <= 0) { perror("send(): error "); completed = 1; } else { packet_time += packet_size * 8; } } } clock_gettime(CLOCK_MONOTONIC, &time_stop); real_time = usecDiff(&time_stop, &time_start); printf("real_time:%d\n",real_time); //sleep_time = 5*1000-real_time; sleep_time =5*1000; if (sleep_time <=0) sleep_time =0; printf("sleep_time:%u\n",sleep_time); usleep(sleep_time); //nanosleep(&nano_sleep_packet, 0); } close(transport_fd); close(sockfd); free(send_buf); return 0; }