У меня есть проблема, которая, я думаю, очень распространена среди разработчиков низкого уровня, которые начинают работать с языками высокого уровня. Я провел некоторое исследование, но не нашел подходящего решения для своей проблемы.
У меня есть клиент-серверное приложение, и я хочу воссоздать весь клиент с «нуля» с помощью С#, но, поскольку я хочу сохранить сервер как есть, «новый» обновленный клиент должен следовать фактическим протоколам отправки и прием пакетов данных.
Если пакеты содержат только неуправляемые типы (byte
, int
и т. д.), все должно быть в порядке, но моя проблема возникает, когда мне приходится работать со строками между управляемым клиентом на C# и неуправляемым сервером на C/C++.
Я уже нашел несколько решений этой проблемы, но я действительно не знаю, какое из них лучше или есть лучшее решение, которого я не заметил.
Первый подход заключается в использовании ключевого слова fixed
для создания структур, представляющих каждый пакет приложения, и при этом C# позволяет мне легко и с очень низкими затратами (я думаю) выполнять приведение указателей (от byte*
к packet_structure*
и наоборот) не беспокоясь обо всех маршалингах и других дорогостоящих методах. Я думаю, что этот подход особенно плох, потому что заставляет меня использовать тип данных sbyte
в буферах, где должна быть строка в пакете, а затем выполнять приведение, чтобы передать эти байты в управляемый мир для правильной обработки.
Другой подход, который я сделал, заключался в том, чтобы объявить структуру каждого пакета управляемой, но помеченной атрибутами MarshalAs
, чтобы использовать методы Marshal
для преобразования данных. Такой подход я считаю более затратным, учитывая, что приложение — это игра, а клиент, который я делаю, — это приложение реального времени. Я думаю, что широкое использование маршалинга для каждого пакета может быть очень дорогим для приложения.
Есть ли какое-нибудь простое и красивое решение, которому я мог бы следовать, что-то вроде стиля C или любого другого решения, в котором мне отказывает моя неопытность? В C очень простого приведения указателя должно быть достаточно, чтобы избавить меня от проблем.
Я влюблен в C#, но я очень боюсь, что не смогу сделать это с этой платформой :(
Кто-нибудь может пролить свет? :/
Большое спасибо за ваше время, любая помощь будет ОЧЕНЬ оценена.