70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
#include "platglue.h"
|
|
|
|
#include "SimStreamer.h"
|
|
#include "CRtspSession.h"
|
|
#include "JPEGSamples.h"
|
|
#include <assert.h>
|
|
#include <sys/time.h>
|
|
|
|
|
|
|
|
void workerThread(SOCKET s)
|
|
{
|
|
SimStreamer streamer(s, true); // our streamer for UDP/TCP based RTP transport
|
|
|
|
CRtspSession rtsp(s, &streamer); // our threads RTSP session and state
|
|
|
|
while (!rtsp.m_stopped)
|
|
{
|
|
uint32_t timeout = 400;
|
|
if(!rtsp.handleRequests(timeout)) {
|
|
struct timeval now;
|
|
gettimeofday(&now, NULL); // crufty msecish timer
|
|
uint32_t msec = now.tv_sec * 1000 + now.tv_usec / 1000;
|
|
rtsp.broadcastCurrentFrame(msec);
|
|
}
|
|
}
|
|
}
|
|
|
|
int main()
|
|
{
|
|
SOCKET MasterSocket; // our masterSocket(socket that listens for RTSP client connections)
|
|
SOCKET ClientSocket; // RTSP socket to handle an client
|
|
sockaddr_in ServerAddr; // server address parameters
|
|
sockaddr_in ClientAddr; // address parameters of a new RTSP client
|
|
socklen_t ClientAddrLen = sizeof(ClientAddr);
|
|
|
|
printf("running RTSP server\n");
|
|
|
|
ServerAddr.sin_family = AF_INET;
|
|
ServerAddr.sin_addr.s_addr = INADDR_ANY;
|
|
ServerAddr.sin_port = htons(8554); // listen on RTSP port 8554
|
|
MasterSocket = socket(AF_INET,SOCK_STREAM,0);
|
|
|
|
int enable = 1;
|
|
if (setsockopt(MasterSocket, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) < 0) {
|
|
printf("setsockopt(SO_REUSEADDR) failed");
|
|
return 0;
|
|
}
|
|
|
|
// bind our master socket to the RTSP port and listen for a client connection
|
|
if (bind(MasterSocket,(sockaddr*)&ServerAddr,sizeof(ServerAddr)) != 0) {
|
|
printf("error can't bind port errno=%d\n", errno);
|
|
|
|
return 0;
|
|
}
|
|
if (listen(MasterSocket,5) != 0) return 0;
|
|
|
|
while (true)
|
|
{ // loop forever to accept client connections
|
|
ClientSocket = accept(MasterSocket,(struct sockaddr*)&ClientAddr,&ClientAddrLen);
|
|
printf("Client connected. Client address: %s\r\n",inet_ntoa(ClientAddr.sin_addr));
|
|
if(fork() == 0)
|
|
workerThread(ClientSocket);
|
|
}
|
|
|
|
closesocket(MasterSocket);
|
|
|
|
return 0;
|
|
}
|