Я подключаюсь к своему локальному биткойну с помощью TCP и наблюдаю следующее поведение:
Я вижу много сообщений, в которых указан только заголовок или прикреплена только часть полезной нагрузки. Конечно, это может быть ошибка и в моем коде.
Байты отправляются кусками? Какие из следующих действительны?
|header1|payload1| (as per documentation, this is valid)
|header1| (no payload, even though required. Have seen this)
|payload1| (no header, have seen this)
|header1|partPayload1| (incomplete payload, not sure if seen these)
|partPayload1| (part earlier header's payload, not sure if seen these)
|header1|payload1|header2|payload2|
|header1|payload1|header2|partPayload2|
|header1|partPayload1|header2|
|partPayload1|header2|payload2|
Примечание. Я использую номер версии 70002, реле = 1 и службы = 0.
РЕДАКТИРОВАТЬ: Обычно я жду оставшиеся байты, и в большинстве случаев они приходят, но в редких случаях, около 2%, приходит какой-то другой заголовок. Это происходит только с tx
сообщениями.
EDIT2: судя по приведенным ниже комментариям, кажется вероятным, что в моем коде есть ошибка. Я проверю и вернусь.
EDIT3: в моем коде была ошибка. Я предполагал, что частичные пакеты данных соответствуют одному заголовку. После завершения данных (в одном пакете) может быть несколько заголовков. Это имеет смысл, если я рассматриваю это как поток.
TCP — это потоковый протокол. Несмотря на то, что по сети поток передается в виде серии IP-сообщений, семантически это просто поток байтов.
Это означает, что на уровне приложения вы не должны заботиться о границах сообщения. Маршрутизаторы и другая интернет-инфраструктура могут произвольно разбивать данные на пакеты, чтобы они соответствовали их базовым протоколам (например, Ethernet имеет кадры размером не более 1500 байт).
Jus12
Питер Уилле
Jus12
x
(не нулевой) байтами, но сообщение имеет размер всего 24 байта или меньше24+x
. Поэтому мне нужно дождаться остальной части сообщения с гарантией того, что одноранговый узел действительно отправил полные данные и находится в пути, и он не отправит заголовок другого сообщения. Верно?Питер Уилле
Jus12
Питер Уилле
Jus12
Питер Уилле
Jus12
|header1|payload1|header2|payload2|
или это всегда только одно сообщение за раз?Питер Уилле