Когда-нибудь Отключение Req находится внутри Publi sh Сообщение - PullRequest
0 голосов
/ 13 марта 2020

На стороне клиента я использую:

mosquitto_pub -t tpc -m msg

На стороне сервера я использую неблокирующий сокет и socket() API:

https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_72/rzab6/xnonblock.htm

После первого полученного пакета я отправляю подтверждение подключения пакета.

Для каждого принятого пакета я печатаю сколько байт было получено и весь буфер в гекс.
Я сравниваю полученные данные с захватом WireShark.

Иногда это хорошо работает:

37 bytes received - Connect Command
10 bytes received - Publish Message [tpc]
2 bytes received - Disconnect Req

Иногда я получаю Требование отключения внутри Publi sh Сообщение [tpc] :

37 bytes received - Connect Command
12 bytes received - Publish Message [tpc] + Disconnect Req

Последние два байта: Требование отсоединения :

30
8
0
3
74
70
63
6d
73
67
ffffffe0  <--
0         <--

Как мне избежать этих ситуаций и получить всегда 3 пакеты?

1 Ответ

2 голосов
/ 13 марта 2020

Краткий ответ: вы не можете. Вы должны фактически проанализировать сообщения, чтобы определить длину.

Константа для создания сокета tcp называется SOCK_STREAM по причине. Сокет должен рассматриваться как таковой: поток байтов. Никто не гарантирует, что один send() на одной стороне приведет к одному recv() на другой стороне. Единственная гарантия состоит в том, что последовательность сохраняется: abcd может стать (ab, cd), но не станет acbd. Пакеты могут быть разделены где-то на полпути. Возможно, клиент отправляет 2048 байт, но на стороне сервера вы получите сначала ~ 1400 байт, а затем остальные. Таким образом, N send s не приводит к N recv.

Другое дело, что клиент также обрабатывает сокет как поток. Он может отправлять байты за байтом или отправлять пакет сообщений с одним send(). N сообщения не являются N send с.

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