rtp.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <netinet/in.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <arpa/inet.h>
  10. struct rtpbits {
  11.   int sequence:16; /* sequence number: random */
  12.   int pt:7; /* payload type: 14 for MPEG audio */
  13.   int m:1; /* marker: 0 */
  14.   int cc:4; /* number of CSRC identifiers: 0 */
  15.   int x:1; /* number of extension headers: 0 */
  16.   int p:1; /* is there padding appended: 0 */
  17.   int v:2; /* version: 2 */
  18. };
  19. struct rtpheader { /* in network byte order */
  20.   struct rtpbits b;
  21.   int timestamp; /* start: random */
  22.   int ssrc; /* random */
  23.   int iAudioHeader; /* =0?! */
  24. };
  25. void initrtp(struct rtpheader *foo) {
  26.   foo->b.v=2;
  27.   foo->b.p=0;
  28.   foo->b.x=0;
  29.   foo->b.cc=0;
  30.   foo->b.m=0;
  31.   foo->b.pt=14; /* MPEG Audio */
  32. #ifdef FEFE
  33.   foo->b.sequence=42;
  34.   foo->timestamp=0;
  35. #else
  36.   foo->b.sequence=rand() & 65535;
  37.   foo->timestamp=rand();
  38. #endif
  39.   foo->ssrc=rand();
  40.   foo->iAudioHeader=0;
  41. }
  42. int sendrtp(int fd, struct sockaddr_in *sSockAddr, struct rtpheader *foo, void *data, int len) {
  43.   char *buf=alloca(len+sizeof(struct rtpheader));
  44.   int *cast=(int *)foo;
  45.   int *outcast=(int *)buf;
  46.   outcast[0]=htonl(cast[0]);
  47.   outcast[1]=htonl(cast[1]);
  48.   outcast[2]=htonl(cast[2]);
  49.   outcast[3]=htonl(cast[3]);
  50.   memmove(buf+sizeof(struct rtpheader),data,len);
  51.   return sendto(fd,buf,len+sizeof(*foo),0,(struct sockaddr *)sSockAddr,sizeof(*sSockAddr));
  52. /*  return write(fd,buf,len+sizeof(*foo))==len+sizeof(*foo); */
  53. }
  54. /* create a sender socket. */
  55. int makesocket(char *szAddr,unsigned short port,int TTL,struct sockaddr_in *sSockAddr) {
  56.   int          iRet, iLoop = 1;
  57.   struct       sockaddr_in sin;
  58.   char         cTtl = (char)TTL;
  59.   char         cLoop=0;
  60.   unsigned int tempaddr;
  61.   int iSocket = socket( AF_INET, SOCK_DGRAM, 0 );
  62.   if (iSocket < 0) {
  63.     fprintf(stderr,"socket() failed.n");
  64.     exit(1);
  65.   }
  66.   tempaddr=inet_addr(szAddr);
  67.   sSockAddr->sin_family = sin.sin_family = AF_INET;
  68.   sSockAddr->sin_port = sin.sin_port = htons(port);
  69.   sSockAddr->sin_addr.s_addr = tempaddr;
  70.   iRet = setsockopt(iSocket, SOL_SOCKET, SO_REUSEADDR, &iLoop, sizeof(int));
  71.   if (iRet < 0) {
  72.     fprintf(stderr,"setsockopt SO_REUSEADDR failedn");
  73.     exit(1);
  74.   }
  75.   if ((ntohl(tempaddr) >> 28) == 0xe) {
  76.     /* only set multicast parameters for multicast destination IPs */
  77.     iRet = setsockopt(iSocket, IPPROTO_IP, IP_MULTICAST_TTL, &cTtl, sizeof(char));
  78.     if (iRet < 0) {
  79.       fprintf(stderr,"setsockopt IP_MULTICAST_TTL failed.  multicast in kernel?n");
  80.       exit(1);
  81.     }
  82.     cLoop = 1; /* !? */
  83.     iRet = setsockopt(iSocket, IPPROTO_IP, IP_MULTICAST_LOOP,
  84.       &cLoop, sizeof(char));
  85.     if (iRet < 0) {
  86.       fprintf(stderr,"setsockopt IP_MULTICAST_LOOP failed.  multicast in kernel?n");
  87.       exit(1);
  88.     }
  89.   }
  90.   return iSocket;
  91. }