在C#中通过TCP发送C结构

时间:2012-08-14 14:23:54

标签: c# c tcp memcpy

我正在编写一个程序,通过TCP与一台设备的管理界面进行交互。问题是,设备的文档是用C语言编写的,而我写的程序是用C#编写的。我的问题是,文档指定

  

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

没有任何谷歌搜索可以指向我这个API或我如何通过TCP发送原始结构。文档似乎暗示我应该使用memcpy将结构复制到TCP缓冲区,但C#不直接支持memcpy。在C#中是否存在等效方法或以不同方式实现此目的

2 个答案:

答案 0 :(得分:5)

您可以构建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();
}

答案 1 :(得分:0)

您将使用不安全的结构,BitConverter或编写托管C ++包装来填充API缓冲区。
基本上你是通过调用套接字而不是调用函数来进行P / Invoke。