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

📄 rtpclient.c

📁 It support IPv4 and IPv6 unicast and multicast and contains a trivial sender and a trivial receiver
💻 C
字号:
#include "socket.h"#include "ip4.h"#include "ip6.h"#include "uint16.h"#include "open.h"#include "byte.h"#include "scan.h"#include "strerr.h"#include <stdlib.h>#include <sys/time.h>#include <unistd.h>/* usage: anycast (ip4|\[ip6\]):port ... *//* return pointer to first byte of payload data */char *rtp_skipheader(unsigned char *packet) {  char v=packet[0]>>6;  char cc=packet[0] & 15;  if (v==2)    return packet+12+(cc*4);  else    return packet;}/* initialize RTP header according to RFC; version=2, all flags zero, * payload type as specified and sequence number, timestamp and SSRC * random. */void rtp_initheader(char *header, char payloadtype) {  int fd=open_read("/dev/urandom");  int i;  for (i=2; i<12; i++)    header[i]=rand() & 255;  read(fd,header+2,10);  header[0]=0x80;  header[1]=payloadtype;}/* increment sequence number */void rtp_nextsequence(char *header) {  uint16 s;  uint16_unpack_big(header+2,&s);  s++;  uint16_pack_big(header+2,s);}/* read sequence number */uint16 rtp_getsequence(char *header) {  uint16 s;  uint16_unpack_big(header+2,&s);  return s;}/* read payload type */char rtp_getpt(char *header) {  return header[1]<<1;}int main(int argc,char *argv[]) {  char buf[1500];  unsigned char ip[16];  long len,port=5004;  int v6=0;  int s;  if (argc<2)    strerr_die1x(0,"usage: rtpclient ip [port]\nWill dump rtp payloads to stdout, default port is 5004.");  if (argc>2) {    len=scan_ulong(argv[2],&port);    if (argv[2][len])      strerr_die1x(0,"rtpclient: invalid port number: parse error.");    if (port>0xffff)      strerr_die1x(0,"rtpclient: invalid port number: too large.");  }  len=ip4_scan(argv[1],ip);  if (argv[1][len]) {    len=ip6_scan(argv[1],ip);    if (argv[1][len])      strerr_die1x(0,"rtpclient: invalid ip: parse error.");    v6=1;  }  if (v6) {    if ((s=socket_udp6())==-1)      strerr_die1sys(111,"anycast: unable to create UDP socket: ");    ndelay_off(s);    if (socket_bind6_reuse(s,(char *)V6any,port,0) == -1)      strerr_die1sys(111,"anycast: unable to bind: ");    if (ip[0]==0xff)      if (socket_mcjoin6(s,ip,0) == -1)	strerr_die1sys(111,"anycast: unable to join multicast group: ");  } else {    if ((s=socket_udp())==-1)      strerr_die1sys(111,"anycast: unable to create UDP socket: ");    ndelay_off(s);    if (socket_bind4_reuse(s,(char *)V6any,port) == -1)      strerr_die1sys(111,"anycast: unable to bind: ");    if ((ip[0] & 0xf0) == 0xe0)      if (socket_mcjoin4(s,ip,(char*)V6any) == -1)	strerr_die1sys(111,"anycast: unable to join multicast group: ");  }  for (;;) {    unsigned char src_ip[16];    uint16 src_port;    uint32 scope_id;    char *tmp;    if (v6) {      if ((len=socket_recv6(s,buf,1500,src_ip,&src_port,&scope_id))==-1)	strerr_die1sys(111,"anycast: IPv6 recvmsg failed: ");    } else {      if ((len=socket_recv4(s,buf,1500,src_ip,&src_port))==-1)	strerr_die1sys(111,"anycast: IPv4 recvmsg failed: ");    }    tmp=rtp_skipheader(buf);    write(1,tmp,len-(tmp-buf));  }  return 0;}

⌨️ 快捷键说明

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