Получить и установить флаги пакетов udp и контрольную сумму с помощью c # - PullRequest
3 голосов
/ 07 сентября 2011

Я знаю, как отправлять байтовые данные на сервер по протоколу udp. Как я могу активировать некоторые флаги на отправляемом пакете? Как я могу позвонить, если в пакете, который получен, активированы некоторые флаги. Кроме того, как я могу прочитать контрольную сумму, содержащуюся в пакете? Если я хочу отправить пакет без данных и только с флагом, как я могу это сделать? Я хочу сделать это с помощью C #. Я не хочу изменять локальную конечную точку, ни удаленную конечную точку, ни что-либо еще о каждом пакете.

Редактировать

Причина, по которой я хочу это сделать, заключается в том, что я так старался сделать tcp punch holing. Я открыл вопрос о вознаграждении на пересылке трафика из порта X на компьютер B с помощью c # «UDP punch hole in firewall» в любом случае мне удалось выполнить udp punch holing. В результате я хочу сделать UDP надежным.

Другими словами, я хочу создать алгоритм, который позволит мне отправлять пакеты udp до места назначения в правильном порядке. Если бы я мог установить и прочитать некоторые флаги, это облегчило бы этот алгоритм.

Я знаю, что создавать будет нелегко, но, по крайней мере, я хочу попробовать. Я потратил много времени на поиск библиотеки c #, которая делает это ...

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

У UDP уже есть контрольная сумма .

Вы хотели спросить о чем-то вроде RUDP ?Это позволяет вам гарантировать доставку и заказ пакетов (как ни один, так и любой из них). Lidgren реализует надежный протокол UDP.

Если вы хотите свернуть свой собственный, прочитайте о том, как SEQ и ACK работают в TCP ;и эмулировать это через UDP (что в основном делает Лидгрен).

1 голос
/ 07 сентября 2011

Честно говоря, я думаю, что будет трудно заставить сторону TCP работать так, как она решает этот вопрос, и, поскольку TCP предназначен для того, чтобы выполнять то, что вы просите, я лично возьму на себя "Подход «Правильный инструмент, для правильной работы».

Тем не менее ....

Если вам действительно нужно использовать UDP, то вы можете забыть о добавлении чего-либо на уровне протокола, нижележащем транспортном уровнепросто проигнорирую это.

Вместо этого вам придется разработать собственный протокол уровня байтов (почти возвращаясь ко временам RS232 и последовательной связи ...)

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

Я бы посмотрел на структуры данных, такие как TLV(Используется многими смарт-картами) - TLV обозначает Tag-Length-Value, поэтому может представлять что-то вроде:

    0x10 0x04 0x01 0x02 0x03 0x04

Где код команды 0x10 может означать тикер обновления, 0x04 - 4 байтаследующие данные ... затем 4 байта данных.

Что касается флагов и проверки сумм, то флаги лёгкие - это просто, вы можете получить 8 из них в байте и просто перевернуть их, используя маски AND.

    0x00 AND 0x01 = 0x01
    0x01 AND 0x80 = 0x81

Проверить суммы немного сложнее, но это действительно зависит от того, какой уровень точности вам нужен.По сути, контрольная сумма - это своего рода математический алгоритм, который использует содержимое ваших данных для создания магического числа, которое можно легко вычислить на приемной стороне.

Это может быть что-то простое, например сложение всех значений вместезатем добавьте результат к какому-нибудь магическому номеру, затем добавьте его в конец пакета перед отправкой байтов.

Затем сделайте то же самое на приемном конце и сравните результаты.

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

Есть еще много открытыхисходные реализации таких вещей, как XModem, ZModem, Kermit, YModem и многих других, все еще плавающих вокруг, так как большинство из них могут (и делали) работать с потоками байтов, тогда не должно быть слишком сложно заставить их работать с потоком байтов поверхUDP вместо байтового потока через последовательный порт.

...