-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
100 lines (85 loc) · 2.59 KB
/
main.cpp
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
#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <iostream>
int demon_routine()
{
auto port = 8888;
auto in = socket(AF_INET, SOCK_STREAM, 0);
if (in < 0) {
//std::cerr << "Socket creation failed: " << strerror(errno) << std::endl;
return 1;
}
struct sockaddr_in localhost;
memset(&localhost, 0, sizeof(struct sockaddr_in));
localhost.sin_family = AF_INET;
localhost.sin_port = htons(port);
localhost.sin_addr.s_addr = htonl(INADDR_ANY);
int res = bind(in, (struct sockaddr*) &localhost, sizeof(localhost));
if (res < 0) {
//std::cerr << "Bind error: " << strerror(errno) << std::endl;
return 1;
}
struct linger linger_opt = { 1, 0 };
setsockopt(in, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt));
res = listen(in, 1);
if (res < 0) {
//std::cerr << "Listen error: " << strerror(errno) << std::endl;
return 1;
}
struct sockaddr_in peeraddr;
socklen_t peeraddr_len;
int peer = accept(in, (struct sockaddr*) &peeraddr, &peeraddr_len);
if (peer < 0) {
//std::cerr << "Accept error: " << strerror(errno) << std::endl;
return 1;
}
/*std::cout << "Connection from IP "
<< ( ( ntohl(peeraddr.sin_addr.s_addr) >> 24) & 0xff ) << "."
<< ( ( ntohl(peeraddr.sin_addr.s_addr) >> 16) & 0xff ) << "."
<< ( ( ntohl(peeraddr.sin_addr.s_addr) >> 8) & 0xff ) << "."
<< ( ntohl(peeraddr.sin_addr.s_addr) & 0xff ) << ", port "
<< ntohs(peeraddr.sin_port);
*/
char buffer[1024];
res = read(peer, buffer, 1023);
if (res < 0) {
//std::cerr << "Read error: " << strerror(errno) << std::endl;
return 1;
}
buffer[res] = 0;
if (std::string(buffer) == "{'command': 'start'}") {
//start stream
std::string responce = "{'name': %имя машины%, 'link': 'http://ip-в-подсети-запросившего/live.m3u8'}";
write(peer, responce.data(), responce.size());
close(peer);
} else {
// ignore
close(peer);
}
return 0;
}
int main()
{
auto pid = fork();
if (pid == -1) {
std::cerr << "Fork error: " << strerror(errno) << std::endl;
return 1;
}
if (!pid) {
umask(0);
setsid();
chdir("/");
close(0); // in
close(1); // out
close(2); // err
return demon_routine();
}
else {
return 0;
}
}