UDP-сервер и клиент работают и не показывают никаких ошибок при компиляции или запуске, кроме как после предоставления ему более 20 символов.Затем внезапно у меня только 19 символов возвращаются на стороне сервера.
Похоже, что SizeConst
строки имеет фактическое измерение -1
.
Когда я отправляю строки, это работает, пока я не получу строку длиннее 20 символов.Он хранит только 19 символов, хотя SizeConst = 20
.(а когда 3, то только 2 символа и т. д.)
Может кто-нибудь объяснить, почему я вдруг пропускаю некоторые данные?
/******************** STRUCT *****************************/
[StructLayout(LayoutKind.Sequential)]
public struct TEST
{
public string Buffer;
public int number;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
public string aString;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] innerTestArray;
}
/****************** CLIENT ********************************//
static void Main(string[] args)
{
//Start ServerSide acknowledge
byte[] resp = Encoding.ASCII.GetBytes("INIT");
sendData(resp);
while (true)
{
TEST test = new TEST();
Console.WriteLine("");
Console.WriteLine("ReadLine : ");
test.aString = Console.ReadLine();
test.number = 10;
test.innerTestArray = null;
test.Buffer = null;
byte[] arr = structToBytes(test);
sendData(arr);
}
}
/**************** MARSHAL FUNCTIONS *************************/
static byte[] structToBytes(object str)
{
byte[] arr = new byte[Marshal.SizeOf(str)];
IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(str));
Marshal.StructureToPtr(str, pnt, false);
Marshal.Copy(pnt, arr, 0, Marshal.SizeOf(str));
Marshal.FreeHGlobal(pnt);
return arr;
}
static TEST structFromBytes(byte[] arr)
{
TEST str = new TEST();
int size = Marshal.SizeOf(str);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(arr, 0, ptr, size);
str = (TEST)Marshal.PtrToStructure(ptr, str.GetType());
Marshal.FreeHGlobal(ptr);
return str;
}
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)]
В этом примере явыделено 20
как SizeConstant
для строки.Но когда я получаю строку, она имеет SizeOf(string) = 19
.
Также было бы неплохо иметь более гибкий подход для строки и других массивов, чтобы обеспечить большую гибкость.То есть не использовать SizeConst
в структуре.Как и в этом примере, у меня есть только некоторые небольшие данные, но позже у меня есть некоторые различия в данных для отправки.Список и массивы структур и различных типов данных.
Любые СОВЕТЫ, ТРИКИ, ИДЕИ ??
PS: ДЕМО-КОД на https://github.com/ritskes/C-UDP-struct-to-byte-DEMO-with-server-and-client