【问题标题】:Sending C structs through TCP in C#在 C# 中通过 TCP 发送 C 结构
【发布时间】:2012-08-10 20:53:26
【问题描述】:

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

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

似乎再多的谷歌搜索都无法将我指向这个 API 或我如何通过 TCP 发送原始结构。文档似乎暗示我应该使用 memcpy 将结构复制到 TCP 缓冲区,但 C# 不直接支持 memcpy。 C# 中是否有等效的方法或不同的方法来完成此操作

【问题讨论】:

  • 你即将与丑陋的溪流相遇。有一些提示here。
  • 这个问题完美地说明了为什么网络协议一开始就不应该基于 C 结构。协议设计者请注意。

标签: c# c tcp memcpy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 为什么必须使用非托管内存才能复制到字节数组?不能直接复制到字节数组吗?我想这与 C# 的工作原理有关,但解释会很好..
    猜你喜欢
    • 2010-12-16
    • 2018-06-26
    • 2016-01-11
    • 2014-09-02
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多