blob: 7e0392f4a4dc24e0a9957a5d568a4202c1770de4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/**
* ======================== legal notice ======================
*
* File: ServerSocket.cc
* Created: 4. Juli 2012, 07
* Author: <a href="mailto:geronimo013@gmx.de">Geronimo</a>
* Project: libnetworking: classes for tcp/ip sockets and http-protocol handling
*
* CMP - compound media player
*
* is a client/server mediaplayer intended to play any media from any workstation
* without the need to export or mount shares. cmps is an easy to use backend
* with a (ready to use) HTML-interface. Additionally the backend supports
* authentication via HTTP-digest authorization.
* cmpc is a client with vdr-like osd-menues.
*
* Copyright (c) 2012 Reinhard Mantey, some rights reserved!
* published under Creative Commons by-sa
* For details see http://creativecommons.org/licenses/by-sa/3.0/
*
* The cmp project's homepage is at http://projects.vdr-developer.org/projects/cmp
*
* --------------------------------------------------------------
*/
#include <ServerSocket.h>
#include <Logging.h>
#include <fcntl.h>
cServerSocket::cServerSocket(int Port, int Queue)
: cAbstractSocket(Port, Queue)
, port(Port)
, active(false)
{
}
cServerSocket::~cServerSocket()
{
}
bool cServerSocket::Open(void)
{
bool rv = cAbstractSocket::Open(port);
if (rv) active = true;
return rv;
}
void cServerSocket::Close(void)
{
active = false;
cAbstractSocket::Close();
}
cConnectionPoint *cServerSocket::Accept(void)
{
cConnectionPoint *rv = NULL;
while (active && !rv) {
rv = cAbstractSocket::Accept(port, 500);
}
return rv;
}
void cServerSocket::ConfigureSocket(int Socket)
{
if (!ForceBlockingIO()) {
// make it non-blocking:
int oldflags = fcntl(Socket, F_GETFL, 0);
if (oldflags < 0) {
esyslog("could not retrieve old socket flags");
return;
}
oldflags |= O_NONBLOCK;
if (fcntl(Socket, F_SETFL, oldflags) < 0) {
esyslog("failed to set nonblocking state of socket");
return;
}
}
}
void cServerSocket::SetBlockingIO(bool ForceBlockingIO)
{
cAbstractSocket::SetBlockingIO(ForceBlockingIO);
}
bool cServerSocket::ForceBlockingIO() const
{
return cAbstractSocket::ForceBlockingIO();
}
void cServerSocket::SetPort(int Port)
{
if (active) {
esyslog("ERROR: server socket is already active! Can't change port settings!");
return;
}
port = Port;
}
|