blob: fa4c98139e7c6a584d7925ac74d21c1be79fddca [file] [log] [blame]
#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;
}