mirror of
https://github.com/JvanKatwijk/dab-cmdline
synced 2025-10-06 08:02:52 +02:00
125 lines
3.5 KiB
C++
125 lines
3.5 KiB
C++
![]() |
#
|
||
|
/*
|
||
|
* Copyright (C) 2016, 2017
|
||
|
* Jan van Katwijk (J.vanKatwijk@gmail.com)
|
||
|
* Lazy Chair Computing
|
||
|
*
|
||
|
* This file is part of the DAB-library
|
||
|
* DAB-library is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* DAB-library is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with DAB-library; if not, write to the Free Software
|
||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
*
|
||
|
* Simple streaming server, for e.g. epg data and tpg data
|
||
|
*/
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include <ringbuffer.h>
|
||
|
#include <arpa/inet.h>
|
||
|
#include "tcp-server.h"
|
||
|
|
||
|
tcpServer::tcpServer (int port) {
|
||
|
buffer = new RingBuffer<uint8_t> (32 * 32768);
|
||
|
connected. store (false);
|
||
|
threadHandle = std::thread (&tcpServer::run, this, port);
|
||
|
}
|
||
|
|
||
|
tcpServer::~tcpServer (void) {
|
||
|
if (running. load ()) {
|
||
|
running. store (false);
|
||
|
usleep (1000);
|
||
|
threadHandle. join ();
|
||
|
}
|
||
|
delete buffer;
|
||
|
}
|
||
|
|
||
|
void tcpServer::sendData (uint8_t *data, int32_t amount) {
|
||
|
if (connected)
|
||
|
buffer -> putDataIntoBuffer (data, amount);
|
||
|
}
|
||
|
#define BUF_SIZE 1024
|
||
|
|
||
|
void tcpServer::run (int port) {
|
||
|
// Variables for writing a server.
|
||
|
/*
|
||
|
* 1. Getting the address data structure.
|
||
|
* 2. Opening a new socket.
|
||
|
* 3. Bind to the socket.
|
||
|
* 4. Listen to the socket.
|
||
|
* 5. Accept Connection.
|
||
|
* 6. Receive Data.
|
||
|
* 7. Close Connection.
|
||
|
*/
|
||
|
int socket_desc , client_sock , c , read_size;
|
||
|
struct sockaddr_in server , client;
|
||
|
|
||
|
//Create socket
|
||
|
socket_desc = socket(AF_INET , SOCK_STREAM , 0);
|
||
|
if (socket_desc == -1) {
|
||
|
fprintf (stderr, "Could not create socket");
|
||
|
return;
|
||
|
}
|
||
|
fprintf (stderr, "Socket created");
|
||
|
running. store (true);
|
||
|
// Prepare the sockaddr_in structure
|
||
|
server.sin_family = AF_INET;
|
||
|
server.sin_addr.s_addr = INADDR_ANY;
|
||
|
server.sin_port = htons (port);
|
||
|
|
||
|
// Bind
|
||
|
if (bind (socket_desc,
|
||
|
(struct sockaddr *)&server , sizeof(server)) < 0) {
|
||
|
// print the error message
|
||
|
perror ("bind failed. Error");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
fprintf (stderr, "I am now accepting connections ...\n");
|
||
|
// Listen
|
||
|
listen (socket_desc , 3);
|
||
|
while (running) {
|
||
|
// Accept a new connection and return back the socket desciptor
|
||
|
c = sizeof(struct sockaddr_in);
|
||
|
|
||
|
// accept connection from an incoming client
|
||
|
client_sock = accept (socket_desc,
|
||
|
(struct sockaddr *)&client,
|
||
|
(socklen_t*)&c);
|
||
|
if (client_sock < 0) {
|
||
|
perror("accept failed");
|
||
|
return;
|
||
|
}
|
||
|
fprintf (stderr, "Connection accepted");
|
||
|
connected = true;
|
||
|
try {
|
||
|
uint8_t localBuffer [BUF_SIZE];
|
||
|
int16_t amount;
|
||
|
int status;
|
||
|
while (running. load ()) {
|
||
|
while (running. load () &&
|
||
|
(buffer -> GetRingBufferReadAvailable () < BUF_SIZE))
|
||
|
usleep (1000);
|
||
|
amount = buffer -> getDataFromBuffer (localBuffer, BUF_SIZE);
|
||
|
status = send (client_sock, localBuffer, amount ,0);
|
||
|
if (status == -1) {
|
||
|
throw (22);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
catch (int e) {}
|
||
|
connected = false;
|
||
|
}
|
||
|
// Close the socket before we finish
|
||
|
close (socket_desc);
|
||
|
running. store (false);
|
||
|
}
|