powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вопрос по сокетам (linux)
2 сообщений из 2, страница 1 из 1
PHP: Вопрос по сокетам (linux)
    #40073305
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно по скорому сделать простенький однопоточный telnet-клиент.
Есть класс с методом appcmd, класс при инициализации подключается к telnet-серверу, при вызове метода appcmd отправляет на telnet-сервер указанную строку, получает ответ от сервера и возвращает как результат вызова метода.
Метод appcmd выглядит примерно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
	public function appcmd($cmd, $args)
	{
		...(проверка аргументов и предварительная обработка)...
		$str = ...(итоговая строка, отправляемая на telnet-сервер)...
		if (strtoupper($cmd) == 'AUTH') {
			$ws = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));
			$rc = socket_connect($ws, $srv, $port));
			...
			$this->store['appsrv'] = $ws;
			$ret = $this->telnet_send_wait($str);
		} else {
			if (!isset($this->store['appsrv']))
			{
				$rc = $this->appcmd('AUTH', ['bmuser'=>$usr, 'bmpassword'=>$pwd]);
				if (!$rc) return $rc;
			}
			$ret = $this->telnet_send_wait($str);
		}
		return $ret;
	}


Ну а telnet_send_wait — это собственно код работы с сокетом.

Подскажите, как лучше его написать?
Нужен ли мне socket_select?
Что лучше использовать, socket_write/socket_read или socket_send/socket_recv?
Пока в общих чертах я сделал примерно так:
Код: 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.
	private function telnet_send_wait($command, $timeout=null)
	{
		if (!isset($this->store['appsrv'])) return;
		$ws = $this->store['appsrv'];
		$command .= "\n";
		$rc = socket_write($ws, $command);
		if ($rc === false)
		{
			if ($this->log) $this->log->error("Socket send error #".socket_last_error($ws), socket_strerror(socket_last_error($ws)), __CLASS__);
			return;
		}
		do {
			$r = [$ws]; $w = null; $e = null;
			$rc = socket_select($r, $w, $e, 0);
			if ($rc === false)
			{
				if ($this->log) $this->log->error("Socket check error #".socket_last_error($ws), socket_strerror(socket_last_error($ws)), __CLASS__);
				return;
			}
			if (!$rc) break;
			$rc = socket_select($r, $w, $e, 1);
			if ($rc === false)
			{
				if ($this->log) $this->log->error("Socket wait error #".socket_last_error($ws), socket_strerror(socket_last_error($ws)), __CLASS__);
				return;
			}
			if (!$rc) break;
			$res = '';
			foreach ($r as $s)
			{
				$data = socket_read($s, 1024, PHP_NORMAL_READ);
				$res .= $data;

			}
		} while (1);
	}
...
Рейтинг: 0 / 0
PHP: Вопрос по сокетам (linux)
    #40073307
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему, собственно, вопрос.
Такой минимальный код вполне функционирует:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	private function telnet_send_wait($command, $timeout=null)
	{
		if (!isset($this->store['appsrv'])) return;
		if (!isset($timeout)) $timeout = 1;
		$ws = $this->store['appsrv'];
		$command .= "\n";
		$rc = socket_write($ws, $command);
		if ($rc === false) return;
print "> $command";
		$rc = socket_read($ws, 2048);
		if ($rc === false) return;
print "< $rc";
print "\n";
		return $rc;
	}


Чем он принципиально хуже более сложного кода (c select/send/recv)?
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP: Вопрос по сокетам (linux)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]