/*
RTMP - Socket Server
$ID: $
*/
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <fcntl.h>
#include "rtmp.h"
int listenerFD = 0x0;
pthread_t listenerThread;
pthread_mutex_t sConnectionsMutex;
myConnections_t *connections = 0x0;
int sStartListener() {
int optVal = 0x1;
struct sockaddr_in myAddr; // my address information
if ((listenerFD = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
if (setsockopt(listenerFD, SOL_SOCKET, SO_REUSEADDR, &optVal, sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
myAddr.sin_family = AF_INET; // host byte order
myAddr.sin_port = htons(MYPORT); // short, network byte order
myAddr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset(myAddr.sin_zero, '\0', sizeof myAddr.sin_zero);
if (bind(listenerFD, (struct sockaddr *)&myAddr, sizeof(struct sockaddr)) == -1) {
perror("bind");
exit(1);
}
if (listen(listenerFD, BACKLOG) == -1) {
perror("listen");
exit(1);
}
pthread_mutex_init(&sConnectionsMutex,NULL);
pthread_create(&listenerThread,NULL,(void *)sListenerThread,(void *)listenerFD);
return(0x0);
}
ssize_t sReadSocket(int socketFD,void *buffer,size_t lenght) {
ssize_t recLen = 0x0;
fd_set readset;
FD_ZERO(&readset);
FD_SET(socketFD,&readset);
while (select(socketFD + 1,&readset,0x0,0x0,0x0)) {
if (FD_ISSET(socketFD,&readset))
break;
}
//recv(socketFD,AMFS[amfID].body + (AMFS[amfID].bodyCount - 1),128,0);
return(recLen);
}
void sListenerThread(int listenerFD) {
int newFD = 0x0; //New Socket;
socklen_t sin_size;
struct sockaddr_in remoteAddr; // connector's address information
while (1) {
sin_size = sizeof(struct sockaddr_in);
if ((newFD = accept(listenerFD, (struct sockaddr *)&remoteAddr, &sin_size)) == -1) {
perror("accept");
continue;
}
printf("server: got connection from %s\n",inet_ntoa(remoteAddr.sin_addr));
if (amfDoHandshake(newFD) == -1) {
printf("Error: Bad Handshake\n");
close(newFD);
}
printf("Boobies");
fcntl(newFD, F_SETFL, fcntl(newFD, F_GETFL, 0) | O_NONBLOCK);
sAddConnection(newFD);
}
}
int sAddConnection(int socketFD) {
myConnections_t *tmpConnection = 0x0;
pthread_mutex_lock(&sConnectionsMutex);
if (connections == 0x0) {
connections = (myConnections_t *)malloc(sizeof(myConnections_t));
connections->prev = 0x0;
connections->next = 0x0;
connections->socketFD = socketFD;
}
else {
tmpConnection = (myConnections_t *)malloc(sizeof(myConnections_t));
tmpConnection->socketFD = socketFD;
tmpConnection->prev = 0x0;
tmpConnection->next = connections;
connections->prev = tmpConnection;
connections = tmpConnection;
}
printf("Socket Added");
pthread_mutex_unlock(&sConnectionsMutex);
return(0x0);
}