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

📄 anycast.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];  char ip[16];  long len,type=14,port=5004;  int v6=0;  int s;  uint32 ts;  struct timeval start,now;  if (argc<2)    strerr_die1x(0,"usage: anycast ip [port]\nWill multi/unicast stdin, default port is 5004.");  if (argc>2) {    len=scan_ulong(argv[2],&port);    if (argv[2][len])      strerr_die1x(0,"anycast: invalid port number: parse error.");    if (port>0xffff)      strerr_die1x(0,"anycast: invalid port number: too large.");  }  if (argc>3) {    len=scan_ulong(argv[3],&type);    if (argv[3][len])      strerr_die1x(0,"anycast: invalid type: parse error.");    if (type>127)      strerr_die1x(0,"anycast: invalid type: 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,"anycast: invalid ip: parse error.");    v6=1;  }  rtp_initheader(buf,type); /* default 14 == MPEG Audio */  uint32_unpack_big(buf+4,&ts);  if (v6) {    if ((s=socket_udp6())==-1)      strerr_die1sys(111,"anycast: unable to create UDP socket: ");    if (socket_bind6_reuse(s,(char *)V6any,port,0) == -1)      strerr_die1sys(111,"anycast: unable to bind: ");  } else {    if ((s=socket_udp())==-1)      strerr_die1sys(111,"anycast: unable to create UDP socket: ");    if (socket_bind4_reuse(s,(char *)V6any,port) == -1)      strerr_die1sys(111,"anycast: unable to bind: ");  }  gettimeofday(&start,0);  for (;;) {    len=read(0,buf+12,1400);    if (len<1)      return 0;    gettimeofday(&now,0);    now.tv_sec-start.tv_sec;    if (now.tv_usec<start.tv_usec) now.tv_sec--;    now.tv_usec-=start.tv_usec;    uint32_pack_big(buf+4,ts+(now.tv_sec*256+(now.tv_usec>>24)));    if (v6) {      if (socket_send6(s,buf,len+12,ip,port,0)==-1)	strerr_die1sys(111,"anycast: IPv6 sendmsg failed: ");    } else {      if (socket_send4(s,buf,len+12,ip,port)==-1)	strerr_die1sys(111,"anycast: IPv4 sendmsg failed: ");    }    rtp_nextsequence(buf);  }  return 0;}

⌨️ 快捷键说明

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