Отправить пакет данных по TCP с использованием сокета PHP

Я хочу отправить команду на сторонний сервер по протоколу TCP, в их документации они указали следующий формат данных команды:

Синтаксис Байты Ценить card_id 4 0x12345678 параметр1 2 0 параметр2 1 1 параметр3 1 0 время 4 time_t соответствует 2004-6-1 13:00:00 data_len 1 08 data_body Переменная (определяется data_len) "12345678"

Я хочу использовать функцию socket_write в php для отправки пакета, поэтому мой вопрос: как я могу преобразовать эти значения для его отправки?

Во-первых: я конвертирую каждое значение в шестнадцатеричное, а затем объединяю его в одну строковую переменную (каждый байт представляет 2 шестнадцатеричных символа). Например: 1 будет 01, если значение находится в 1 байте / 1 будет 0001, если значение будет в 2 байтах.

Во-вторых: я конвертирую каждое значение в двоичное (01), а затем объединяю его в одну строковую переменную (каждый байт представляет 8 бит). Например: 1 будет 00000001, если значение находится в 1 байте / 1 будет 00000000 000000001, если значение будет в 2 байтах.

Пожалуйста, может ли кто-нибудь помочь мне узнать, как я могу представить данные команды для отправки через сокет tcp в php? Я немного смущен.

Используйте функцию pack().

Barmar 11.11.2022 18:32

Как я могу его использовать? У меня есть несколько типов целых, шестнадцатеричных и строковых данных. Можете ли вы привести пример, пожалуйста.

Abbas Khalil 11.11.2022 20:22

Я опубликовал ответ, но, похоже, вы даже не читали документацию, поскольку в ней объясняется, как это сделать.

Barmar 11.11.2022 20:54

Я читал это раньше, но я не понял, как это использовать в моем случае

Abbas Khalil 11.11.2022 22:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте функцию pack() для кодирования ряда значений в виде байтов строки.

$packet = pack('NnCCNCa*', $card_id, $param1, $param2, $param3, $time, $data, $data);
  • N = беззнаковое 4-байтовое число
  • n = беззнаковое 2-байтовое число
  • C = беззнаковый байт
  • a* = строка

4-байтовые и 2-байтовые форматы имеют обратный порядок байтов, что соответствует сетевому порядку байтов.

Должен ли я использовать «N» или «H» для шестнадцатеричного (идентификатор карты)?

Abbas Khalil 11.11.2022 22:51

N. На самом деле вы не отправляете шестнадцатеричный код, он просто показывает значение выборки таким образом.

Barmar 11.11.2022 23:00

Спасибо за помощь. Теперь я отправляю данные с помощью socket_write(), и когда я пытаюсь прочитать данные с помощью socket_read(), он возвращает следующее сообщение: socket_read(): невозможно прочитать из сокета [10054]: существующий соединение было принудительно закрыто удаленным хостом.

Abbas Khalil 12.11.2022 10:29

Другие вопросы по теме