Чтение из TCP-сокета - PullRequest
       9

Чтение из TCP-сокета

0 голосов
/ 30 октября 2018

У меня есть клиенты, отправляющие запрос очень простой формы: просто строка GET/PUT/INSERT/DELETE KEY <VALUE>, где значение необязательно в зависимости от выбранного ключевого слова.

Ключи и значения могут быть произвольного размера.

Я внедряю сервер на C для обслуживания запросов, однако мне кажется, что я сталкиваюсь с проблемой, что системный вызов read () читает некоторые, но не все данные. То есть то, что прочитал сервер, является лишь подмножеством того, что отправил клиент.

Как я могу узнать, когда все сообщение было прочитано?

Пример запросов: INSERT KEYkeyKEYkeyKEY VALUEvalueVALUEvalueVALUE

Но сервер может прочитать: INSERT KEYkeyKEYkeyKEY VALUEvalueVALUE

Как я могу узнать, что все сообщение еще не получено и не прочитано?

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

TCP не предоставляет никакой возможности. TCP является потоково-ориентированным протоколом, все, что он делает, это отправляет поток байтов. Вы можете создать проводной протокол поверх этого потока, чтобы вы могли определять границы сообщений.

Классические способы

  • отправить префикс фиксированного размера с размером ожидаемого сообщения
  • использовать кодировку с самоописанием (например, ber)
  • отправить разделитель - скажем, 2 пустых строки в текстовом протоколе (обычно для старых протоколов RFC)
0 голосов
/ 30 октября 2018

просто небольшая подсказка: вы испытываете краткое чтение. Как упоминалось ранее, обычно вы добавляете заголовок фиксированной длины, который содержит длину сообщения, или анализируете формат сообщения (представьте, что вы получаете строку в формате JSON). Вы также можете переключиться на протокол на основе сообщений, такой как UDP или SCTP.

Также имейте в виду, что теоретически может происходить длительное чтение, то есть вы можете прочитать две команды за одно чтение по сети (или одну команду и половину другой команды).

0 голосов
/ 30 октября 2018

Как я могу узнать, что все сообщение еще не получено и не прочитано?

Вам нужно несколько соглашений , чтобы знать, где заканчиваются сообщения. Вы анализируете свои данные.

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