-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathListen.php
90 lines (75 loc) · 2.79 KB
/
Listen.php
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
<?php
namespace MiksIr\proxy;
/**
* Class Listen
* @package MiksIr\proxy
* Слушаем входящие соединения
*/
class Listen extends Connection {
public $address = '127.0.0.1';
public $port = 8181;
/**
* @throws Exception
* Создаем сокет для входящих соединений и добавляем его в коллекцию
*/
public function create()
{
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($this->socket == false) {
$this->logger->log(LoggerAbstract::CRITICAL, $error = "Can't create socket", ['caller' => __CLASS__.":".__LINE__]);
throw new Exception($error);
}
socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_nonblock($this->socket);
if (socket_bind($this->socket, $this->address, $this->port) === false) {
$this->logger->log(LoggerAbstract::CRITICAL, $error = "Can't bind socket: ".socket_strerror(socket_last_error($this->socket)), ['caller' => __CLASS__.":".__LINE__]);
throw new Exception($error);
}
if (socket_listen($this->socket) === false) {
$this->logger->log(LoggerAbstract::CRITICAL, $error = "Can't listen socket: ".socket_strerror(socket_last_error($this->socket)), ['caller' => __CLASS__.":".__LINE__]);
throw new Exception($error);
}
$this->logger->log(LoggerAbstract::INFO, "Listen socket created {$this->address}:{$this->port}", ['caller' => __CLASS__.":".__LINE__]);
parent::create();
}
/**
* Если есть доступные данные для чтения - значит пришло новое соединение. Получаем его и создаем класс клиента
*/
public function readSocket()
{
$this->logger->log(LoggerAbstract::DEBUG, __CLASS__."::readSocket", ['caller' => __CLASS__.":".__LINE__]);
$new_socket = socket_accept($this->socket);
socket_set_nonblock($new_socket);
if ($new_socket !== false) {
$client = new Client($this->collection, $this->logger);
$client->setSocket($new_socket);
$client->create();
}
}
public function writeSocket()
{
throw new Exception('Только чтение');
}
public function mode()
{
return self::READ;
}
/**
* Забрать уже полученные данные (накапливаются в классе)
* @param bool $clean
* @return mixed
*/
public function getData($clean = true)
{
return;
}
/**
* Отправить
* @param $buffer
* @return mixed
*/
public function putData($buffer)
{
return;
}
}