Как получить фактический размер данных в пакете сокета c# - PullRequest
1 голос
/ 18 июня 2020

Я создаю порт вперед в C#, используя сокеты TCP. Ему не нужно беспокоиться об используемом протоколе приложения.

Однако, в зависимости от протокола приложения, размер пакета может влиять на протокол ... Например, при аутентификации с помощью FTP конечные байты (00) могут привести к ошибкам при отправке ПОЛЬЗОВАТЕЛЯ и ПАРОЛЯ через порт вперед. . Итак ... я решил удалить конечные байты, удалив последнюю последовательность 00 ...

Но протокол s sh начал сбиваться ... Удалив конечные байты, я заканчиваю получение искаженных пакетов ...

Решение, которое я думал, было бы получить фактический размер данных, когда они сначала попадают в порт, а затем переслать точный размер пакетов конечной точке.

Мой вопрос в том, как получить фактический размер данных, когда они попадают в сокет, например: когда я использую socket.Receive, чтобы получить байты, отправленные в инструмент переадресации порта (простым s sh blabla@someIP), как узнать последний байт реальных данных? Последний пакет всегда будет иметь меньше байтов, чем фактический размер буфера, но я понятия не имею, как отличить дополнительное выделяемое пространство от фактических данных в виде 00.

OBS: Я использую класс Socket и получаю , Функции отправки.

1 Ответ

0 голосов
/ 18 июня 2020

Забудьте о нулях; вы не можете ничего сказать о данных, ища нули - и действительно, мусор не может быть нулями (повторное использование буфера et c). При получении данных вы должны смотреть на возвращаемое значение из Receive, которое сообщает вам , сколько данных было прочитано. При отправке данных: ваша задача - сообщить ему , какая часть буфера на самом деле является данными - для этого вы можете использовать буфер сегмент ; есть перегрузки Socket.Send, которые принимают byte[] buffer, int offset, int size - или другие перегрузки, которые принимают ArraySegment<byte> фрагментов (для несмежных буферов).

...