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

📄 test_srtp_server.cpp

📁 完整的RTP RTSP代码库
💻 CPP
字号:
#include "mpeg4ip.h"#include <rtp.h>#include <stdlib.h>#include <unistd.h>#include <sys/utsname.h>#define HAVE_SRTP 1#ifdef HAVE_SRTP#include "liblibsrtp.h"#endif#include <err.h>bool dump_pak;#define BUFFSIZE 1450#define RX 5002#define TX 5000#define TTL 1#define RTCP_BW 1500*0.05#define FILENAME "default.mp4" // default#define OUR_SSRC 0x200#define THEIR_SSRC 0x100#define EOP_PAD 16static FILE *rtcp_file = NULL;static void c_rtp_callback(struct rtp *session, rtp_event *e){  e->type = RX_RTP;  printf("callback : session %p, event type is %d\n", 	 session, e->type);  }#ifdef HAVE_SRTP#define ENCRYPT_FUNCTION our_srtp_encrypt#define DECRYPT_FUNCTION our_srtp_decrypt#define RTCP_ENCRYPT_FUNCTION our_srtp_encrypt#define RTCP_DECRYPT_FUNCTION our_srtp_decryptstatic int our_srtp_encrypt (void *foo, 			     unsigned char *buffer, 			     unsigned int *len){  err_status_t err;  int retdata;  srtp_ctx_t *srtp_ctx = (srtp_ctx_t *)foo;  int i;	//  our_srtp = (bills_srtp_t *)foo;  retdata = *len;  if (dump_pak) {    printf("rtp encrypt len = %d\n", *len);    for (i = 0; i < retdata; i++) {      printf("%02x ", buffer[i]);      if (((i + 1) % 12) == 0) printf("\n");    }    printf("\n");  }  err = srtp_protect(srtp_ctx,		     (void *)buffer,		     &retdata);  if (err != 0) {    printf("return from srtp_protect - value is %d", err);    return FALSE;  }  *len = retdata;  if (dump_pak) {    printf("\nprotected value\n");    for (i = 0; i < retdata; i++) {      printf("%02x ", buffer[i]);      if (((i + 1) % 12) == 0) printf("\n");    }    printf("\n");  }  return TRUE;}     static int our_srtp_decrypt (void *foo, 			     unsigned char *buffer, 			     unsigned int *len){  err_status_t err;  int retdata;  srtp_ctx_t *srtp_ctx = (srtp_ctx_t *)foo;  retdata = *len;  err = srtp_unprotect(srtp_ctx,		       (void *)buffer,		       &retdata);  if (err != 0) {    return FALSE;  }  *len = retdata;  return TRUE;}     #else#define ENCRYPT_FUNCTION our_encrypt#define DECRYPT_FUNCTION our_decrypt#define RTCP_ENCRYPT_FUNCTION our_rtcp_encrypt#define RTCP_DECRYPT_FUNCTION our_rtcp_decryptstatic int our_encrypt(void *foo, unsigned char *buffer, unsigned int *len){  unsigned int ix;  unsigned int retdata;    retdata = *len;  //  printf("starting at %u to %u\n", sizeof(rtp_packet_header) - 1, retdata);  for (ix=sizeof(rtp_packet_header) - 1; ix < retdata; ix++)     buffer[ix] = ~buffer[ix];  return TRUE;}static int our_decrypt(void *foo, unsigned char *buffer, unsigned int *len){  struct rtp *session;  unsigned int ix;  unsigned int retdata;  retdata = *len;  for (ix=sizeof(rtp_packet_header) - 1; ix < retdata; ix++) buffer[ix] = ~buffer[ix];  return TRUE;}static int our_rtcp_encrypt(void *foo, unsigned char *buffer, unsigned int *len){  unsigned int ix;  unsigned int retdata;  if (rtcp_file != NULL) {    fwrite(buffer, *len, 1, rtcp_file);  }  retdata = *len;  //  printf("rtcp starting at %u to %u\n", sizeof(rtp_packet_header) - 1, retdata);  for (ix=sizeof(rtp_packet_header) - 1; ix < retdata; ix++)     buffer[ix] = ~buffer[ix];  return TRUE;}static int our_rtcp_decrypt(void *foo, unsigned char *buffer, unsigned int *len){  struct rtp *session;  unsigned int ix;  unsigned int retdata;  retdata = *len;  for (ix=sizeof(rtp_packet_header) - 1; ix < retdata; ix++) buffer[ix] = ~buffer[ix];  return TRUE;}#endifint main (int argc, char *argv[]){  struct rtp *session;  int   rx_port, tx_port, fd;  uint32_t   read_size, packet_size, number_of_packet;  uint8_t  buff[BUFFSIZE];  off_t cur_pos;  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;  ssize_t readit;  ssize_t sendit;  int do_rtcp = false;  // Setting of 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 = 15002;  tx_port = 15000;  // Option  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("\n-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();  // Open Original File to compare with received file  if((fd = open(filename, O_RDONLY)) == -1){    perror(filename);    exit(1);  }  if ( (session = rtp_init_xmitter(ip_addr, rx_port, tx_port, TTL, RTCP_BW, 				   c_rtp_callback, NULL) ) == NULL){    exit(-1);  }  rtp_set_my_ssrc(session,OUR_SSRC);#ifdef HAVE_SRTP	/////////// start will	//set NULL security services  //uint32_t ssrc = 0xdeadbeef; /* ssrc value hardcoded for now */  srtp_policy_t policy;  char key[64];  char keystr[128];  uint ix;#if 1  //strcpy(keystr, "c1eec3717da76195bb878578790af71c4ee9f859e197a414a78d5abc7451");  strcpy(keystr, "0123456789abcdef0123456789abcdef0123456789abcdef0123456789ab");  hex_string_to_octet_string(key, keystr, 60);#else  memset(key, 0, sizeof(key));#endif  for (ix = 0; ix < 30; ix++) {    printf("%02x", ((unsigned char) key[ix]));  }  printf("\n");#if 0  // NULL cipher  policy.key                 =  (uint8_t *) key;  policy.ssrc.type           = ssrc_any_outbound; //ssrc_specific;  policy.ssrc.value          = 0x96;//OUR_SSRC;  policy.rtp.cipher_type     = NULL_CIPHER;  policy.rtp.cipher_key_len  = 0;   policy.rtp.auth_type       = NULL_AUTH;  policy.rtp.auth_key_len    = 0;  policy.rtp.auth_tag_len    = 0;  policy.rtp.sec_serv        = sec_serv_none;  policy.rtcp.cipher_type    = NULL_CIPHER;  policy.rtcp.cipher_key_len = 0;   policy.rtcp.auth_type      = NULL_AUTH;  policy.rtcp.auth_key_len   = 0;  policy.rtcp.auth_tag_len   = 0;  policy.rtcp.sec_serv       = sec_serv_none;     policy.next                = NULL;#else  //confidentiality only, no auth  //crypto_policy_set_aes_cm_128_null_auth(&policy.rtp);  crypto_policy_set_aes_cm_128_hmac_sha1_80(&policy.rtp);  crypto_policy_set_rtcp_default(&policy.rtcp);  policy.ssrc.type  = ssrc_any_outbound;  policy.key  = (uint8_t *) key;  policy.next = NULL;  policy.rtp.sec_serv = sec_serv_conf;//sec_servs;  policy.rtcp.sec_serv = sec_serv_none;  /* we don't do RTCP anyway */#endif  err_status_t status;  printf("ABOUT TO SRTP_INIT\n");  status = srtp_init();  if (status) {    printf("error: srtp initialization failed with error code %d\n", status);    exit(1);  }  printf("ABOUT TO SRTP_CREAT\n");  srtp_ctx_t *srtp_ctx = NULL;  status = srtp_create(&srtp_ctx, &policy);  if (status) {    printf("error: srtp_create() failed with code %d\n", status);    exit(1);  }  printf("DONE WITH SRTP_CREATE\n");  extra_len = 0;#else  extra_len = 0;  srtp_data = NULL;#endif  rtp_set_encryption(session, ENCRYPT_FUNCTION, DECRYPT_FUNCTION, 		     RTCP_ENCRYPT_FUNCTION, RTCP_DECRYPT_FUNCTION, 		     srtp_ctx, extra_len);  if (do_rtcp) {    rtcp_file = fopen("server.rtcp", FOPEN_WRITE_BINARY);  }  cur_pos = 0;  packet_size = 64;  number_of_packet = 0;  while(1) {    // change BUFFSIZE to be an incrementing value from 64 to 1450    if(packet_size > 1450)      packet_size = 725;    readit = read(fd, buff, packet_size);    if (readit < 0) {      perror("file read");      exit(1);    }    read_size = readit;    //int buflen = readit;    if (read_size == 0) break;    //printf("about to protect\n");#if 0    sendit =       rtp_send_data(session,		    cur_pos,		    97,//pt		    0,//m		    0,//cc 		    NULL, //csrc[],		    buff,//data		    read_size,//data_len		    NULL,//*extn		    0,		    0);#else    {      struct iovec iov[2];      iov[0].iov_len = read_size % 48;      if (iov[0].iov_len == 0) iov[0].iov_len = 1;      iov[0].iov_base = buff;      iov[1].iov_len = read_size - iov[0].iov_len;      iov[1].iov_base = buff + iov[0].iov_len;      sendit = rtp_send_data_iov(session, cur_pos, 97, 0, 0, NULL, 				 iov, read_size > iov[0].iov_len ? 2 : 1,				 NULL, 0, 0, 0);    }#endif    if (sendit < 0) {      printf("rtp_send_data error\n");      exit(1);    }    if (do_rtcp)      rtp_send_ctrl(session, cur_pos, NULL);    printf("set timestamp = "U64", size %u\n", cur_pos, read_size);		    cur_pos += read_size;     packet_size++;    number_of_packet++;		    //rtp_periodic();    //rtp_send_ctrl(session,cur_pos,NULL);    rtp_update(session);    // Some sort of sleep here...    usleep(2 * 1000);  }    printf("I've sent %d RTP packets!\n\n", number_of_packet);  close(fd);  if (rtcp_file != NULL)     fclose(rtcp_file);  rtp_done(session);  return 0;}

⌨️ 快捷键说明

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