通过TCP在C#中发送C结构(Sending C structs through TCP in C#

2019-09-21 04:51发布

我写一个程序,以提供适合在TCP一台设备的管理界面进行交互。 问题是,对于设备的文档是用C写,而我写的程序是在C#。 我的问题是,该文档指定

的通信是基于基于C的结构的API缓冲

谷歌搜索的再多也似乎指向我这个API或如何我通过TCP发送原始结构。 该文件似乎在暗示我应该使用memcpy的结构复制到TCP缓冲区,但C#不直接支持的memcpy。 有没有在C#中equivelant方法或不同的方式来实现这一目标

Answer 1:

你可以建立你的C结构的.NET版本,然后使用编组通过网络发送的字节数组。 下面是用一个例子MLocation C结构。

[StructLayout(LayoutKind.Sequential, Pack = 8)]
public struct MLocation
{
    public int x;
    public int y;
};

public static void Main()
{
    MLocation test = new MLocation();

    // Gets size of struct in bytes
    int structureSize = Marshal.SizeOf(test);

    // Builds byte array
    byte[] byteArray = new byte[structureSize];

    IntPtr memPtr = IntPtr.Zero;

    try
    {
        // Allocate some unmanaged memory
        memPtr = Marshal.AllocHGlobal(structureSize);

        // Copy struct to unmanaged memory
        Marshal.StructureToPtr(test, memPtr, true);

        // Copies to byte array
        Marshal.Copy(memPtr, byteArray, 0, structureSize);
    }
    finally
    {
        if (memPtr != IntPtr.Zero)
        {
            Marshal.FreeHGlobal(memPtr);
        }
    }

    // Now you can send your byte array through TCP
    using (TcpClient client = new TcpClient("host", 8080))
    {
        using (NetworkStream stream = client.GetStream())
        {
            stream.Write(byteArray, 0, byteArray.Length);
        }
    }

    Console.ReadLine();
}


Answer 2:

您将可使用不安全的结构,该BitConverter或写一个托管C ++包装来填补API缓冲区。
从本质上讲,你正在做的P /调用带有插座,而不是调用一个函数调用。



文章来源: Sending C structs through TCP in C#
标签: c# c tcp memcpy