Маленько переиначил его под свои нужды, но функции касающиеся socket_write остались в оригинале.
А теперь проблема - если я в одной функции вызываю socket_write() более двух раз - 3-ий и остальные пакеты в сокет не уходят. При этом возвращаемое значение (количество переданных байтов) каждый раз соответствует размеру пакета, как будто он реально передан в сокет, и отловить непереданные пакеты в коде не получается. Ошибок естественно не возвращается. Сокет не блокируемый.
PHP:
скопировать код в буфер обмена
скопировать код в буфер обмена
- class GlobalServerClient extends socketServerClient {
- public function write($buffer) {
- return parent::write($buffer."\0");
- }
- ...
- // здесь мне надо отправить несколько пакетов
- $this->write('1');
- $this->write('2');
- $this->write('3');
- $this->write('4');
- $this->write('5');
- ...
- }
- abstract class socketServerClient extends socketClient {...}
- abstract class socketClient extends socket {
- public $write_buffer = '';
- public function write($buffer)
- {
- $this->write_buffer .= $buffer;
- if ($this->do_write()) return true;
- else return false;
- }
- public function do_write()
- {
- try {
- $written = parent::write($this->write_buffer, $length);
- // WRITTEN в каждый раз равен LENGTH - проверял.
- if ($written < $length) {
- } else {
- $this->write_buffer = '';
- }
- return true;
- } catch (socketException $e) {
- //обработка ошибки
- return false;
- }
- return false;
- }
- }
- abstract class socket {
- public $socket;
- public function write($buffer, $length = 4096)
- {
- //обработка ошибки
- //обработка ошибки
- }
- return $ret;
- }
- }