📄 anycast.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 + -