rtp.c
资源名称:NETVIDEO.rar [点击查看]
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:
流媒体/Mpeg4/MP4
开发平台:
Visual C++
- #include <stdlib.h>
- #include <string.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <stdlib.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?! */
- };
- void initrtp(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;
- }
- int sendrtp(int fd, struct sockaddr_in *sSockAddr, struct rtpheader *foo, 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. */
- int makesocket(char *szAddr,unsigned short port,int TTL,struct sockaddr_in *sSockAddr) {
- int iRet, iLoop = 1;
- struct sockaddr_in sin;
- char cTtl = (char)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 failedn");
- 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;
- }