2017-09-05 27 views
0

C/C++ 응용 프로그램에서 UDP를 통해 데이터를 수신하고 있습니다. 이 응용 프로그램은 클래스의 memcpy를 버퍼에 넣고 자신의 방식으로 던지고 있습니다. 우리의 응용 프로그램은 C#으로 작성되었으며 어떻게 든 데이터를 이해해야합니다. 우리는 구조체의 헤더 파일에 접근 할 수 있습니다. 모든 것은 기본적으로 구조체 또는 열거 형입니다. 데이터가 들어오는 형식을 변경할 수 없으며 헤더 파일이 자주 변경 될 수 있습니다.C#에서 사용되는 UDP를 통한 C++ 클래스는 무엇입니까?

저는 C++에서 comms 클래스를 다시 작성하여 데이터를 수신 한 다음 직렬화에 대한 제어력이 더 큽니다. 그러나 오랜 시간이 걸릴 것이며 C++은 녹슬지 않습니다. C++ 스레딩에 대한 많은 경험이 필요합니다.

C#을 통해 액세스 할 수 있도록 제공되는 헤더 파일을 사용하여 몇 가지 프로토 타입 C++ 라이브러리를 만들었지 만 C#에서 실제 클래스 인스턴스를 만들고 사용하는 방법에 대해 머리를 터지게 할 수는 없습니다. 이걸 들여다 볼 때마다 외부 함수를 사용하지 않고 extern 함수 호출 만 보입니다.

마샬링에 대해서도 살펴 보았습니다. 그러나 데이터가 자주 변경되기 쉽기 때문에 이것이 최후의 수단이라고 생각하며 매우 수동적이라고 생각합니다.

아무에게도 옵션을 알고 있거나 더 이상이 문제에 대해 독서 또는 조언을 받아 본 적이 없습니까?

+1

* "클래스의 memcpy"는 어떻게 생겼습니까? 메타 정보가 포함되어 있습니까? – Sinatr

+0

사용자 지정 형식으로 개체를 반환하는 관리되지 않는 dll 함수를 호출하는 경우이 형식/개체를 C# (예 : struct)로 다시 작성하고 개체를이 형식으로 캐스팅해야합니다. – Noren

+0

슬프게도 메타 데이터가 없습니다. – user3103055

답변

0

각 끝에서 Google 프로토콜 버퍼 (예 : C++ 및 C#)를 사용하지 않는 이유는 무엇입니까? C++ 정의를 가져 와서 PB가 모든 직렬화 작업을 수행하게합니다.

프로토콜 버퍼는 구조화 된 데이터를 직렬화하기위한 Google의 언어 중립적이며 플랫폼 독립적 인 확장형 메커니즘입니다. XML은 작지만 빠르고 빠르며 단순합니다. 데이터를 한 번 구성하는 방법을 정의한 다음 특수 생성 된 소스 코드를 사용하여 다양한 데이터 스트림과 다양한 언어로 구조화 된 데이터를 쉽게 읽고 쓸 수 있습니다. more...

기본 유형 대화가 일반적으로 문제가되는 경우에도 다른 OS에서 작동합니다.

+0

감사합니다. 나중에 참조 할 수 있도록 좀 더 자세히 살펴 보겠습니다. 그러나 데이터를 보내는 C++ 프로세스는 수정할 수 없으며 데이터가 내 장치 이상으로 브로드 캐스팅되므로 모든 클라이언트에서 코드 변경이 필요합니다. 이것은 현재 가능하지 않습니다. 다른 모든 클라이언트는 C++이며 단순히 memcpy 일 수 있습니다. – user3103055

+0

@ user3103055 좋습니다. Marshalling은 아마도 손으로 직접 만들거나 C++ 구조체에서 C# 정의를 자동으로 생성하는 도구를 작성하는 등 가장 좋은 방법 일 것입니다 – MickyD