Синхронизация чтения и записи - PullRequest
0 голосов
/ 01 июня 2018

Я использую функции read и write для связи между клиентом и сервером.

Если сервер использует два раза write, в Wireshark я вижу, что двапакеты были отправлены, но моя функция read, объединяющая два пакета в одном буфере

Вопрос: Возможно ли, чтобы моя функция read одновременно считывала только одну полезную нагрузку?Я не хочу уменьшать буфер

Пример: Ситуация сейчас:

Отправить (8 байт) Отправить (8 байт)

Читать, читать 16 байт

Я хочу

Отправить (8 байт) Отправить (8 байт)

Чтение, чтение 8 байтов (первый пакет)

Чтение, чтение 8 байт (второй пакет)

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

TCP / IP дает вам упорядоченный поток байтов.Чтение и запись не гарантируют одинаковых границ, как вы видели.

Чтобы увидеть, где начинаются и заканчиваются сообщения, вам нужно добавить дополнительную информацию в свой протокол, чтобы предоставить эту информацию.Работоспособный простой подход - подсчет байтов в начале каждого сообщения.Прочитайте количество байтов, затем вы узнаете, сколько еще байтов нужно прочитать, чтобы получить полное сообщение, а не следующее сообщение.

0 голосов
/ 01 июня 2018

Если вы хотите синхронизировать сервер и клиент, используйте что-то вроде семафоров или вы можете отправлять байты чтения / записи, и это позволит избежать отправки информации до того, как клиент ее прочитает.Или, если вы точно знаете длину сообщения, вы можете разделить прочитанные байты.Если вы сделаете в буфере точную длину сообщения, оставшиеся байты будут потеряны, поэтому сделайте так, чтобы сервер отправлял информацию, когда читатель читает предыдущее сообщение или расширяет буфер и разделяет несколько сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...