Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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结构发送到C++;客户 我遇到了一些麻烦,将通过TCP套接字发送的C++结构的字节传递给C++客户端,以便正确读取。这是结构图_C#_C++_Network Programming_Marshalling - Fatal编程技术网

C# 如何通过网络将C结构发送到C++;客户 我遇到了一些麻烦,将通过TCP套接字发送的C++结构的字节传递给C++客户端,以便正确读取。这是结构图

C# 如何通过网络将C结构发送到C++;客户 我遇到了一些麻烦,将通过TCP套接字发送的C++结构的字节传递给C++客户端,以便正确读取。这是结构图,c#,c++,network-programming,marshalling,C#,C++,Network Programming,Marshalling,C#中的结构 C++中的Struct struct TankBattleStateData { int playerID; float currentHealth; float position[3]; float forward[3]; float cannonForward[3]; int canFire; int tacticalCount; }; 传输过程如下 使用System.Runtime.InteropServices

C#中的结构

C++中的Struct

struct TankBattleStateData
{
    int playerID;
    float currentHealth;

    float position[3];
    float forward[3];

    float cannonForward[3];

    int canFire;
    int tacticalCount;
};
传输过程如下

  • 使用
    System.Runtime.InteropServices.Marshal
    获取表示结构的C#字节数组
  • 将字节数组导入socket中,发送给C++客户端< /li>
  • 客户端在收到字节后,将收到的字节的memcpy发送到堆上的
    无符号字符
    数组中,如果需要,在复制之前会调整数组的大小
    • 有一些检查,比如验证读取的字节数,但没有特别可靠的检查
  • 要读取其内容,客户端将指向char数组的指针强制转换为
    TankBattleStateData*
    ,并取消对它的引用以访问其字段
  • <>我发现,在C++客户端上,与C++客户端一样,最后一个字段<<代码> TraceCaltCuth[/Cord>]不是相同的值。例如,我将从服务器发送
    1
    ,然后在客户端返回
    81742424

    环境

    操作系统:Windows 10 x64
    服务器:C#w/.NET Framework 2.0(Unity3D 5.3.2f1)
    客户端:C++ W/MSVC++ 14版/P> 我想知道的

  • 我做错了什么
    • 更具体地说,我在客户身上做错了什么?我建立了一个C客户端,它看起来没有问题接收数据,不像C++客户端。
  • 有没有现有的图书馆可以让我的生活更轻松

  • 我遇到的一个问题是,C#
    bool
    被封送为,而不是1字节,这是MSVC++14中bool的大小。我想使用
    bool
    ,但为了减少可能出现的问题,我现在使用
    int

    [StructLayout(LayoutKind.Sequential)]
    添加到结构中,然后使用
    [FieldOffset]< /代码>以布局字段与C++版本完全匹配。

    您应该了解的是数据结构的序列化和反序列化。有多种可用的协议、库和方法。将数据发送到内存中可能会对Endiad、文本字段和数组有奇怪的含义。

    您的C++ >代码> int <代码> s是什么大小?你确定它们不是16位吗?(关于2),你可以查看像谷歌协议缓冲区或MessagePack这样的二进制序列化库,这样做是为了独立于平台C++。这让我相信它们是32位的。(再次感谢!)似乎我只能使用。使用这两个属性都会导致一个错误,即,
    FieldOffset属性只能放置在使用StructLayout(LayoutKind.Explicit)标记的类型的成员上。
    编辑:抱歉,没有意识到按ENTER键会提交我的评论。我还没写完或者测试完这两个。给我一秒钟…@terrehbyte:你说得对;我的意思是明确的。(除非
    Sequential
    匹配,在这种情况下,您可以使用该选项)
    struct TankBattleStateData
    {
        int playerID;
        float currentHealth;
    
        float position[3];
        float forward[3];
    
        float cannonForward[3];
    
        int canFire;
        int tacticalCount;
    };