Вы не сказали, используете ли вы потоковый сокет или сокет дейтаграммы.
Если вы используете сокет дейтаграммы (например, вы используете UDP / IP), то вы всегда будете получать весь пакет сразу, поэтому вы сможете идентифицировать данные, потому что они соответствуют найденному unique_packet_id
до |
в начале текущего пакета.
Если вы используете потоковый сокет (например, вы используете TCP / IP), то, я думаю, у вас есть проблема. Ваш формат пакета не разделен или не экранирован, так как вы узнаете, где заканчивается один пакет и начинается следующий?
Если вы используете потоковый сокет, вам нужно, например, использовать формат пакета, подобный следующему:
- уникальный идентификатор пакета (скажем, в ASCII, оканчивается на CRNL - или как вы выберете)
- длина контента (в том же формате)
- полезная нагрузка пакета
Получатель может найти конец пакета, потому что он знает, сколько байтов будет частью полезной нагрузки.
Вам также нужно будет подготовиться к случаю, когда вы получите один из ваших пакетов маленькими кусочками. Например, ваша функция обратного вызова может вызываться один раз с частью уникального идентификатора пакета, вызываться снова с остальной частью заголовка и частью полезной нагрузки, и снова с остальной частью полезной нагрузки и полным следующим пакетом, прикрепленным к концу. , Или вы можете получить три целых пакета и часть четвертого за один вызов функции обратного вызова.
Другое возможное решение, о котором вы упоминаете, - отправка unique_packet_id в каждом фрагменте данных, невозможна, поскольку отправитель не знает, как данные будут разбиты на блоки при доставке получателю.