📄 rtp.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 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;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -