Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中通过TCP发送C结构#_C#_C_Tcp_Memcpy - Fatal编程技术网

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

C# 在C中通过TCP发送C结构#,c#,c,tcp,memcpy,C#,C,Tcp,Memcpy,我正在编写一个程序,通过TCP与设备的管理接口进行交互。问题是,设备的文档是用C语言编写的,而我正在编写的程序是用C语言编写的。我的问题是,文档指定 通信基于基于C结构的API缓冲区 再多的谷歌搜索似乎也不能告诉我这个API,或者我是如何通过TCP发送原始结构的。文档似乎暗示我应该使用memcpy将结构复制到TCP缓冲区,但C#不直接支持memcpy。在C++中是否有一个相等的方法或不同的方法来完成这个< /p> < p>您将使用不安全的结构,BitConverter或编写一个托管C++包装器来

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

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


再多的谷歌搜索似乎也不能告诉我这个API,或者我是如何通过TCP发送原始结构的。文档似乎暗示我应该使用memcpy将结构复制到TCP缓冲区,但C#不直接支持memcpy。在C++中是否有一个相等的方法或不同的方法来完成这个< /p> < p>您将使用不安全的结构,BitConverter或编写一个托管C++包装器来填充API缓冲区。
本质上,您是通过调用套接字而不是调用函数来执行P/Invoke。

您可以构建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结构。协议设计者请注意。为什么要使用非托管内存才能复制到bytearray?不可能直接复制到bytearray吗?我想这与C#的工作原理有关,不过解释一下就好了。。