⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_srtp_client.cpp

📁 完整的RTP RTSP代码库
💻 CPP
字号:
#define HAVE_SRTP 1#include "mpeg4ip.h"#include <rtp.h>#include <stdio.h>#include <unistd.h>#include <sys/utsname.h>#include "liblibsrtp.h"#include "memory.h"bool dump_pak = false;#define BUFFSIZE 2048#define TTL 1#define RTCP_BW 1500*0.05#define FILENAME "default.mp4" // default#define OUR_SSRC 0x100#define THEIR_SSRC 0x200#define EOP_PAD 16static FILE *rtcp_file = NULL;struct rtp *session;#if 0uint16_t previous = 0;#endifuint32_t rtp_timestamp;int fd;int number_of_received_packet;uint32_t number_of_bytes;static void c_rtp_callback(struct rtp *session, rtp_event *e){  rtp_packet *pak;  char buf_from_file[BUFFSIZE];  switch (e->type) {  case RX_RTP:    //printf("session %p, event type is RX_RTP\n", session);        // process rtp packet     pak = (rtp_packet *)e->data;        // Check sequence numbers received.      // Make sure that they are consecutive#if 0    if(previous != 0){      if((pak->ph.ph_seq != (previous + 1))) {	printf("packet loss");	exit(1);      }    }    previous = pak->ph.ph_seq;#endif         // Save the last rtp_timestamp from the packet for use below    rtp_timestamp = pak->ph.ph_ts;    if (number_of_bytes != rtp_timestamp) {      printf("error - bytes %u ts %u\n", number_of_bytes, rtp_timestamp);      lseek(fd, rtp_timestamp, SEEK_SET);      number_of_bytes = rtp_timestamp;    }    if((read(fd, buf_from_file, pak->rtp_data_len) == -1)){      perror("file read");      exit(1);    }    //debug by nori    //write(1, pak->rtp_data, pak->rtp_data_len);#if 0    printf("payload data\n");    for (ix = 0; ix < pak->rtp_data_len; ix++) {      printf("%02x ", (unsigned char)pak->rtp_data[ix]);      if (((ix + 1) % 8) == 0) printf("\n");    }    printf("\n");#endif#if 0    printf("file data\n");    for (ix = 0; ix < pak->rtp_data_len; ix++) {      printf("%02x ", (unsigned char)buf_from_file[ix]);      if (((ix + 1) % 8) == 0) printf("\n");    }    printf("\n");#endif    // Compare data in packet with data in file.  Use the    // pak->rtp_data pointer and compare for pak->rtp_data_len bytes    if (memcmp(pak->rtp_data, buf_from_file, pak->rtp_data_len) != 0) {      printf("fail:received timestamp = %u sequence number = %u size %u\n",	     rtp_timestamp,	     pak->rtp_pak_seq,	     pak->rtp_data_len);    }else {      //printf("my_ssrc = %d\n", rtp_my_ssrc(session));      printf("success:received timestamp = %u sequence number = %u size %u\n",	     rtp_timestamp,	     pak->rtp_pak_seq,	     pak->rtp_data_len);    }    number_of_bytes += pak->rtp_data_len;    number_of_received_packet++;    xfree(pak);    break;      case RX_SR:    printf("session %p, event type is RX_SR\n", session);    break;  case RX_RR:    printf("session %p, event type is RX_RR\n", session);    break;  case RX_SDES:    printf("session %p, event type is RX_SDES\n", session);    break;  case RX_BYE:    printf("session %p, event type is RX_BYE\n", session);    break;  case SOURCE_CREATED:    printf("session %p, event type is SOURCE_CREATED\n", session);    break;  case SOURCE_DELETED:    printf("session %p, event type is SOURCE_DELETED\n", session);    break;  case RX_RR_EMPTY:    printf("session %p, event type is RX_RR_EMPTY\n", session);    break;  case RX_RTCP_START:    printf("session %p, event type is RX_RTCP_START\n", session);    break;  case RX_RTCP_FINISH:    printf("session %p, event type is RX_RTCP_FINISH\n", session);    break;  case RR_TIMEOUT:    printf("session %p, event type is RR_TIMEOUT\n", session);    break;  case RX_APP:    printf("session %p, event type is RX_APP\n", session);    break;  }}static void rtp_end(void){  if (session != NULL) {    //rtp_send_bye(session);    rtp_done(session);  }  session = NULL;}int main (int argc, char *argv[]){  int recv_judge;  struct timeval tv;  int rx_port, tx_port;  char *ip_addr;  char filename[1024];  int c;                          struct hostent *h;  struct utsname myname;  void *srtp_data;  unsigned int extra_len;  int do_auth = 1, do_encrypt = 1;  int do_rtcp = false;  //int buff[BUFFSIZE];  //const char passphrase[]="DESnori";  // default session   if(uname(&myname) < 0){    fprintf(stderr,"uname\n");    exit(1);  }  if((h = gethostbyname(myname.nodename)) == NULL) {    herror("gethostbyname");    exit(1);  }  ip_addr = strdup(inet_ntoa(*((struct in_addr *)h->h_addr)));  rx_port = 15000;  tx_port = 15002;  opterr = 0;  while((c = getopt(argc, argv, "acdehi:r:t:f:")) != -1) {    switch (c) {    case 'a':      do_auth = 0;      break;    case 'c':      do_rtcp = 1;      break;    case 'd':      dump_pak = true;      break;    case 'e':      do_encrypt = 0;      break;    case 'h':      printf("Usage: ./test_rtp_client -i <IP_Addr> -r <rx_port> -t <tx_port> -f <filename>\n");      printf("Default values are as follows...\n");      printf("ip_addr = %s\n", ip_addr);      printf("rx_port = %d\n", rx_port);      printf("tx_port = %d\n", tx_port);      printf("Filename = %s\n", filename);      exit(-1);    case 'i':      strcpy(ip_addr, optarg);      break;    case 'r':      rx_port = atoi(optarg);      break;    case 't':      tx_port = atoi(optarg);      break;    case 'f':      strcpy(filename,optarg);      break;    case '?':      printf("usage: ./test_rtp_client -i <IP_Addr> -r <rx_port> -t <tx_port> -f <filename>\n");      exit(1);    }  }  if (optind < argc) {    for(; optind < argc; optind++) {      printf("error->%s(#%d): put -[i|r|t|f] \n", argv[optind],optind-1);    }    exit(1);  }  // display session information  printf("-Session Information-\n");  printf("  ip_addr = %s\n", ip_addr);  printf("  rx_port = %d\n", rx_port);  printf("  tx_port = %d\n", tx_port);  printf("  filename = %s\n", filename);  printf("Press Return key...");  //getchar();  if (do_rtcp) {    rtcp_file = fopen("client.rtcp", FOPEN_WRITE_BINARY);  }    if((fd = open(filename, O_RDONLY)) == -1){    perror(filename);    exit(-1);  }  if( (session = rtp_init(ip_addr, rx_port, tx_port, TTL, 			  RTCP_BW, c_rtp_callback, NULL)) == NULL){    exit(-1);  }  rtp_set_option(session, RTP_OPT_WEAK_VALIDATION, FALSE);  rtp_set_option(session, RTP_OPT_PROMISC, TRUE);  rtp_set_my_ssrc(session,OUR_SSRC);  extra_len = 0;  srtp_data = NULL;  //rtp_set_encryption_key(session, passphrase);  //rtp_set_encryption(session, our_encrypt, our_decrypt, buff);    /////////// start will  //set NULL security services  //uint32_t ssrc = 0xdeadbeef; /* ssrc value hardcoded for now */#ifdef HAVE_SRTP    int status =0;  printf("ABOUT TO SRTP_INIT\n");  srtp_if_t* srtp_session = srtp_setup_from_sdp("test", session, "a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:ASNFZ4mrze8BI0VniavN7wEjRWeJq83vASNFZ4mr");  if (status) {    printf("error: srtp initialization failed with error cde %d\n", status);    exit(1);  }#endif  recv_judge = 1;  number_of_received_packet = 0;  number_of_bytes = 0;  while((recv_judge == 1)) {    tv.tv_sec = 10;    tv.tv_usec = 0;    recv_judge = rtp_recv(session, &tv, rtp_timestamp);    // Here, we have to call a periodic function to send RTCP.    //rtp_send_ctrl(session, rtp_timestamp, NULL);    rtp_update(session);  }  printf("\nI've received %d RTP packets!\n\n", number_of_received_packet);  close(fd);  if (rtcp_file != NULL)     fclose(rtcp_file);  rtp_end();  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -