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

📄 rtp.c

📁 音频编码
💻 C
字号:
/* $Id: rtp.c,v 1.12 2003/11/29 11:16:55 aleidinger Exp $ */#ifdef HAVE_CONFIG_H# include <config.h>#endif#ifndef __GNUC__# if HAVE_ALLOCA_H#  include <alloca.h># else#  ifdef _AIX#pragma alloca#  else#   ifndef alloca /* predefined by HP cc +Olibcalls */char *alloca ();#   endif#  endif# endif#endif#include <stdio.h>#ifdef STDC_HEADERS# include <stdlib.h># include <string.h>#else# ifndef HAVE_STRCHR#  define strchr index#  define strrchr rindex# endifchar *strchr (), *strrchr ();# ifndef HAVE_MEMCPY#  define memcpy(d, s, n) bcopy ((s), (d), (n))#  define memmove(d, s, n) bcopy ((s), (d), (n))# endif#endif#ifdef HAVE_UNISTD_H# include <unistd.h>#endif#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#ifdef WITH_DMALLOC#include <dmalloc.h>#endifstruct rtpbits {    int     sequence:16;     /* sequence number: random */    int     pt:7;            /* payload type: 14 for MPEG audio */    int     m:1;             /* marker: 0 */    int     cc:4;            /* number of CSRC identifiers: 0 */    int     x:1;             /* number of extension headers: 0 */    int     p:1;             /* is there padding appended: 0 */    int     v:2;             /* version: 2 */};struct rtpheader {           /* in network byte order */    struct rtpbits b;    int     timestamp;       /* start: random */    int     ssrc;            /* random */    int     iAudioHeader;    /* =0?! */};voidinitrtp (struct rtpheader *foo){    foo->b.v        =  2;    foo->b.p        =  0;    foo->b.x        =  0;    foo->b.cc       =  0;    foo->b.m        =  0;    foo->b.pt       = 14;     /* MPEG Audio */#ifdef FEFE    foo->b.sequence = 42;    foo->timestamp  =  0;#else    foo->b.sequence = rand () & 65535;    foo->timestamp  = rand ();#endif    foo->ssrc       = rand ();    foo->iAudioHeader = 0;}intsendrtp (int fd, struct sockaddr_in *sSockAddr, struct rtpheader *foo,         const void *data, int len){    char   *buf = alloca (len + sizeof (struct rtpheader));    int    *cast = (int *) foo;    int    *outcast = (int *) buf;    outcast[0] = htonl (cast[0]);    outcast[1] = htonl (cast[1]);    outcast[2] = htonl (cast[2]);    outcast[3] = htonl (cast[3]);    memmove (buf + sizeof (struct rtpheader), data, len);    return sendto (fd, buf, len + sizeof (*foo), 0,                   (struct sockaddr *) sSockAddr, sizeof (*sSockAddr));/*  return write(fd,buf,len+sizeof(*foo))==len+sizeof(*foo); */}/* create a sender socket. */intmakesocket (char *szAddr, unsigned short port, unsigned char TTL,            struct sockaddr_in *sSockAddr){    int     iRet, iLoop = 1;    struct sockaddr_in sin;    unsigned char    cTtl = TTL;    char    cLoop = 0;    unsigned int tempaddr;    int     iSocket = socket (AF_INET, SOCK_DGRAM, 0);    if (iSocket < 0) {        fprintf (stderr, "socket() failed.\n");        exit (1);    }    tempaddr = inet_addr (szAddr);    sSockAddr->sin_family = sin.sin_family = AF_INET;    sSockAddr->sin_port = sin.sin_port = htons (port);    sSockAddr->sin_addr.s_addr = tempaddr;    iRet = setsockopt (iSocket, SOL_SOCKET, SO_REUSEADDR, &iLoop, sizeof (int));    if (iRet < 0) {        fprintf (stderr, "setsockopt SO_REUSEADDR failed\n");        exit (1);    }    if ((ntohl (tempaddr) >> 28) == 0xe) {        /* only set multicast parameters for multicast destination IPs */        iRet =            setsockopt (iSocket, IPPROTO_IP, IP_MULTICAST_TTL, &cTtl,                        sizeof (char));        if (iRet < 0) {            fprintf (stderr,                     "setsockopt IP_MULTICAST_TTL failed.  multicast in kernel?\n");            exit (1);        }        cLoop = 1;      /* !? */        iRet = setsockopt (iSocket, IPPROTO_IP, IP_MULTICAST_LOOP,                           &cLoop, sizeof (char));        if (iRet < 0) {            fprintf (stderr,                     "setsockopt IP_MULTICAST_LOOP failed.  multicast in kernel?\n");            exit (1);        }    }    return iSocket;}#if 0/* *//* code contributed by Anonymous source.  Supposed to be much better *//* then original code, but only seems to run on windows with MSVC.   *//* and I cannot test it *//* */#include <stdlib.h>#include <string.h>#include <netinet/in.h>#include <unistd.h>#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <arpa/inet.h>struct rtpbits {  int sequence:16;	/* sequence number: random */  int pt:7;	/* payload type: 14 for MPEG audio */  int m:1;	/* marker: 0 */  int cc:4;	/* number of CSRC identifiers: 0 */  int x:1;	/* number of extension headers: 0 */  int p:1;	/* is there padding appended: 0 */  int v:2;	/* version: 2 */};struct rtpheader {	/* in network byte order */  struct rtpbits b;  int timestamp;	/* start: random */  int ssrc;		/* random */  int iAudioHeader;	/* =0?! */};voidrtp_initialization(    struct rtpheader *foo){  foo->b.v=2;  foo->b.p=0;  foo->b.x=0;  foo->b.cc=0;  foo->b.m=0;  foo->b.pt=14;		/* MPEG Audio */#ifdef FEFE  foo->b.sequence=42;  foo->timestamp=0;#else  foo->b.sequence=rand() & 65535;  foo->timestamp=rand();#endif  foo->ssrc=rand();  foo->iAudioHeader=0;}intrtp_send(    SOCKET s,    struct rtpheader *foo,    void *data,    int len){    char *buffer=malloc(len+sizeof(struct rtpheader));    int *cast=(int *)foo;    int *outcast=(int *)buffer;    int count, size ;    outcast[0]=htonl(cast[0]);    outcast[1]=htonl(cast[1]);    outcast[2]=htonl(cast[2]);    outcast[3]=htonl(cast[3]);    memmove (buffer+sizeof(struct rtpheader),data,len);/*    return sendto (fd,buf,len+sizeof(*foo),0,(struct sockaddr *)sSockAddr,sizeof(*sSockAddr)); *//*  return write(fd,buf,len+sizeof(*foo))==len+sizeof(*foo); */    size = len + sizeof (*foo) ;    count = send (s, buffer, size, 0) ;    free (buffer) ;    return count != size ;}/* create a sender socket. */intrtp_socket(    SOCKET *ps,    char *address,    unsigned short port,    int TTL){/*    int iRet ; */    int iLoop = 1 ;/*    struct  sockaddr_in sin ; */    char    cTTL = (char)TTL ;    char    cLoop=0 ;/*    unsigned int tempaddr ; */    BOOL True = TRUE ;    INT error ;    char *c = "" ;    UINT ip ;    PHOSTENT host ;    SOCKET s ;    SOCKADDR_IN source, dest ;#if 0    int s = socket (AF_INET, SOCK_DGRAM, 0) ;    if (s < 0)    {        fprintf(stderr,"socket() failed.\n");        exit(1);    }    tempaddr=inet_addr(address);    sSockAddr->sin_family = sin.sin_family = AF_INET;    sSockAddr->sin_port = sin.sin_port = htons(port);    sSockAddr->sin_addr.s_addr = tempaddr;    iRet = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *) &iLoop, sizeof(int));    if (iRet < 0)    {        fprintf(stderr,"setsockopt SO_REUSEADDR failed\n");        exit(1);    }    if ((ntohl(tempaddr) >> 28) == 0xe)    {        /* only set multicast parameters for multicast destination IPs */        iRet = setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &cTTL, sizeof(char));        if (iRet < 0) {            fprintf(stderr,"setsockopt IP_MULTICAST_TTL failed.    multicast in kernel?\n");            exit(1);        }        cLoop = 1;	/* !? */        iRet = setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP,		            &cLoop, sizeof(char));        if (iRet < 0)        {            fprintf(stderr,"setsockopt IP_MULTICAST_LOOP failed.    multicast in kernel?\n");            exit(1);        }    }#endif    source.sin_family = AF_INET ;    source.sin_addr.s_addr = htonl (INADDR_ANY) ;    source.sin_port = htons (0) ;    dest.sin_family = AF_INET;    dest.sin_addr.s_addr = inet_addr (address) ;    if (!strcmp (address, "255.255.255.255"))    {    }    else if (dest.sin_addr.s_addr == INADDR_NONE)    {        host = gethostbyname (address) ;        if (host)        {            dest.sin_addr = *(PIN_ADDR) host->h_addr ;        }        else        {	        printf ("Unknown host %s\r\n", address) ;            return 1 ;        }    }    dest.sin_port = htons ((u_short) port) ;    ip = ntohl (dest.sin_addr.s_addr) ;    if (IN_CLASSA(ip)) c = "class A" ;    if (IN_CLASSB(ip)) c = "class B" ;    if (IN_CLASSC(ip)) c = "class C" ;    if (IN_CLASSD(ip)) c = "class D" ;    if (ip == INADDR_LOOPBACK) c = "loopback" ;    if (ip == INADDR_BROADCAST) c = "broadcast" ;    s = socket (AF_INET, SOCK_DGRAM, PF_UNSPEC) ;    if (s == INVALID_SOCKET)    {        error = WSAGetLastError () ;        printf ("socket () error %d\r\n", error) ;        return error ;    }    error = setsockopt (s, SOL_SOCKET, SO_REUSEADDR, (const char *) &True, sizeof (BOOL)) ;    error = bind (s, (struct sockaddr *) &source, sizeof (source)) ;    if (error == SOCKET_ERROR)    {        error = WSAGetLastError () ;        printf ("bind () error %d\r\n", error) ;        closesocket (s) ;        return error ;    }    if (ip == INADDR_BROADCAST)    {        printf ("broadcast %s:%u %s\r\n", inet_ntoa (dest.sin_addr), ntohs (dest.sin_port), c) ;        error = setsockopt (s, SOL_SOCKET, SO_BROADCAST, (const char *) &True, sizeof (BOOL)) ;        if (error == SOCKET_ERROR)        {            error = WSAGetLastError () ;            printf ("setsockopt (%u, SOL_SOCKET, SO_BROADCAST, ...) error %d\r\n", s, error) ;            closesocket (s) ;            return error ;        }    }    if (IN_CLASSD(ip))    {        printf ("multicast %s:%u %s\r\n", inet_ntoa (dest.sin_addr), ntohs (dest.sin_port), c) ;/*        error = setsockopt (s, IPPROTO_IP, IP_MULTICAST_TTL, (const char *) &TTL, sizeof (int)) ; */        error = setsockopt (s, IPPROTO_IP, 3, (const char *) &TTL, sizeof (int)) ;        if (error == SOCKET_ERROR)        {            error = WSAGetLastError () ;            printf ("setsockopt (%u, IPPROTO_IP, IP_MULTICAST_TTL, ...) error %d\r\n", s, error) ;            closesocket (s) ;            return error ;        }    }    error = connect (s, (PSOCKADDR) &dest, sizeof (SOCKADDR_IN)) ;    if (error == SOCKET_ERROR)    {        printf ("connect: error %d\n", WSAGetLastError ()) ;        closesocket (s) ;        return error ;    }    *ps = s ;    return 0 ;}#endif

⌨️ 快捷键说明

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